从 netstat 端口检索路径的单行程序

One-liner to retrieve path from netstat port

我正在寻找创建一个单一的班轮,给定一个端口号 (2550) 使用来自 netstat 的 returned 值将允许我然后 运行 结果输出反对 ps -ef 到 return 相关进程的路径。我有:

ps -ef | grep $(netstat -tonp | grep 2550 | awk '{split(,a,"/"); print a[1]}')

虽然我知道

netstat -tonp | grep 2550 | awk '{split(,a,"/"); print a[1]}'

returns 预期的结果,随后的 grep 告诉我没有这样的文件或目录(但是,如果我执行 ps -ef | grep **),它就可以正常工作很好...我显然遗漏了一些东西...好吧,很明显,但我看不到什么?

尝试类似的东西(需要第一个 PID/port 对应,而不是全部):

Port=2550;ps -f --pid $( netstat -tonp |  awk -F '[ \t/]+' -v Port=$Port '[=10=] ~ "([0-9]+[.:]){4}" Port { PID= ;exit}; END { print PID+0 }' ) | sed 's/^\([^ \t]*[ \t]*\)\{7\}//'

最后一个 sed 假设 ps 回复是这样的(space 很重要):

usertest  4408  4397  0 09:43 pts/6    00:00:00 ssh -p 22 -X -l usertest 198.198.131.136

对于每个 PID 且没有结束 sed:

Port=2550; ps -ef | awk -v PIDs="$( netstat -tonp |  awk -F '[ \t/]+' -v Port=${Port} '[=12=] ~ (":" Port) { print }' )" 'BEGIN{ split( PIDs, aTemp, /\n/); for( PID in aTemp) aPID[ aTemp[PID] ] };  in aPID { sub( /^([^ \t]*[ \t]*){7}/, ""); print}'

这将为您提供 pids:

<sudo> netstat -tulpen | awk ' ~ /:2550$/{sub("/.*","",$NF);print $NF}'

您可以使用 xargs 将 pid 传递给 ps:

netstat -tulpen | awk ' ~ /:2550$/{sub("/.*","",$NF);print $NF}' | xargs -P 1 ps -o pid,cmd -p