我试图在没有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
我没有成功。不确定是否有办法。感谢。
答案 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访问。
干杯,
歌德