使用/ proc / <pid>,如何识别网络端口号的应用程序?</pid>

时间:2014-06-19 03:08:49

标签: sockets tcp port pid proc

我试图在没有root访问权限的情况下识别端口56474上运行的应用程序。我知道应用程序是由我启动的。

示例:

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

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

3 个答案:

答案 0 :(得分:7)

注意:添加了另一个答案,因为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的符号链接。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

另一种解决没有root的所有正在运行的应用的pids和端口的技术:

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

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

// in UserDetailController
$scope.user = $scope.loginState.user;   

3.。)调用并解析 tcp tcp6 udp udp6 文件的输出以匹配端口 uids

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

4.。)匹配两个匹配项的 uids ,获取 port-to-pid 地图,无需su访问。

干杯,

歌德