【问题标题】:Using /proc/<pid>, how can I identify a network port number's application?使用 /proc/<pid>,我如何识别网络端口号的应用程序?
【发布时间】:2014-08-09 11:49:33
【问题描述】:

我正在尝试识别在端口 56474 上运行的应用程序,而无需 root 访问权限。我知道该应用程序是由我启动的。

例子:

netstat -tunap

tcp        0      0 0.0.0.0:56474           0.0.0.0:*               LISTEN      -               

我已经尝试使用 /proc/pid 脚本在 ls -l /proc/pid/fd 结果上使用 grep 遍历所有结果。这是我的尝试。注意:不确定我是否朝着正确的方向前进

for I in `find /proc/*/fd -exec ls -l {} \; 2>/dev/null | awk -F"->|:" '/socket/ {print $4}' | sort -u | sed -e 's/\[//g' -e 's/\]//g'`; do grep $I /proc/*/net/tcp; done

我没有成功。不知道有没有办法。谢谢。

【问题讨论】:

    标签: sockets tcp port pid proc


    【解决方案1】:

    注意:添加了另一个答案,因为 lsof 不令人满意。

    这应该有效:

    #! /bin/bash
    port=56474
    hex_port=$(echo "obase=16; $port" | bc )
    
    inode=$(cat /proc/net/tcp | grep ":$hex_port" | awk '{print $10}')
    
    for i in $(ps axo pid); do
            ls -l /proc/$i/fd 2> /dev/null | grep -q ":\[$inode\]" &&  echo $i
    done 
    

    解释:

    一旦我们将端口号转换为十六进制,我们就可以从 /proc/net/tcp(第 10 个字段)中获取 inode 号,然后我们遍历 /proc/pids/fd 并找到指向该 inode 的符号链接。

    【讨论】:

    • 不错!有用!我运行它,它给了我一个应用程序名称的 pid。感谢您的帮助。
    • 工作就像一个魅力!你拯救了我的一天。谢谢你:)
    • 这不适用于所有没有 root 访问权限的系统,因为有时您不允许访问 /proc/&lt;PID&gt;/fd。 PS对不起,我错过了“我知道应用程序是由我启动的”这句话,所以发帖人可以访问他自己的/proc/&lt;PID&gt;/fd
    • 通常的useless use of cat 修复:awk ":$hex_port { print \$10 }" /proc/net/tcp
    【解决方案2】:

    如果您确定应用程序是由您启动的,那么您可以使用lsof

    /usr/sbin/lsof -nP | grep :56474 | awk '{print $2}'

    【讨论】:

    • 谢谢,不过,我需要使用 /proc/* 解决方案。我目前正在寻找一本描述/proc中每个“文件”的书,看看是否可以实现。
    • 可以的,只是添加了一个新的答案。
    【解决方案3】:

    另一种在没有 root 的情况下解析所有正在运行的应用程序的 pid 和端口的技术:

    1.) 获取正在运行的应用程序的 pids。使用 ActivityManager 或解析 ps 控制台输出。

    2.) 遍历 /proc/$pid/net/status 文件并为 pid 获取匹配的 uid

        cat /proc/*pid*/net/status | grep Uid:
    

    3.) 调用并解析tcptcp6udpudp6文件的输出进行匹配端口uids

        cat /proc/net/tcp 
        ...
    

    4.) 匹配两个匹配项的 uids,在没有 su 访问权限的情况下获取 port-to-pid 映射。

    干杯,

    歌德

    【讨论】:

    • /edit: uid 也可以被 AcktivityManager 获取。
    猜你喜欢
    • 2011-08-07
    • 2021-03-15
    • 2013-06-30
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多