Sockets 使用/proc/<;pid>;,如何识别网络端口号';什么申请?

Sockets 使用/proc/<;pid>;,如何识别网络端口号';什么申请?,sockets,tcp,port,pid,proc,Sockets,Tcp,Port,Pid,Proc,我正在尝试识别什么应用程序正在端口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

我正在尝试识别什么应用程序正在端口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

我没有成功。不确定是否有办法。谢谢。

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


/usr/sbin/lsof-nP | grep:56474 | awk'{print$2}'
注意:添加了另一个答案,因为
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的符号链接

解决所有不带root的运行应用程序的PID和端口的另一种技术:

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

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

    cat /proc/*pid*/net/status | grep Uid:
3.)调用并分析tcptcp6udpudp6文件的输出,以匹配端口和UID

    cat /proc/net/tcp 
    ...
4.)匹配两个匹配的UID,获得一个到pid的端口,无需su访问

干杯


歌德

谢谢,但是,我需要使用/proc/*解决方案。我目前正在寻找一本书,描述/proc中的每个“文件”,看看它是否可以实现。它可以,只是添加了一个新的答案。很好!它起作用了!我运行了它,它给了我一个应用程序名称的pid。谢谢你的帮助。工作得很有魅力!你救了我一天。谢谢:)这在没有root访问权限的所有系统上都不起作用,因为有时不允许您访问
/proc//fd
。PS抱歉,我错过了“我知道应用程序是由我启动的”这句话,因此海报可以访问他自己的
/proc//fd
。通常的修复方法:
awk:$hex_port{print\$10})/proc/net/tcp
/edit:uid也可以由AcktivityManager获取。