Одна строка для получения пути из порта netstat - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу создать один лайнер, который, учитывая, что номер порта (2550) использует возвращаемое значение из netstat, позволил бы мне затем запустить результирующий вывод для ps -ef, чтобы вернуть путь рассматриваемого процесса. У меня есть:

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

и пока я знаю

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

возвращает ожидаемый результат, последующий grep сообщает мне, что такого файла или каталога нет (но, если я сделаю ps -ef | grep **), он работает просто отлично ... Я явно что-то упускаю. .. хорошо, очевидно, но я не вижу что?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Это даст вам pids:

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

Вы можете использовать xargs, чтобы передать pid ps:

netstat -tulpen | awk '$4 ~ /:2550$/{sub("/.*","",$NF);print $NF}' | xargs -P 1 ps -o pid,cmd -p
0 голосов
/ 05 ноября 2018

попробуйте что-то вроде (требуется первый соответствующий PID / порт, а не все):

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

последний седь предполагает ps-ответ вроде этого (пробел важен):

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} '$0 ~ (":" Port) { print $7}' )" 'BEGIN{ split( PIDs, aTemp, /\n/); for( PID in aTemp) aPID[ aTemp[PID] ] }; $2 in aPID { sub( /^([^ \t]*[ \t]*){7}/, ""); print}'
...