Jak sprawdzić, które porty są nasłuchiwane przez określony PID?

13

Mam PID określonego procesu nasłuchującego na niektórych portach w moim systemie OS X i muszę wiedzieć, które porty są nasłuchiwane przez ten proces. Jak mogę to zrobić?

Wiem, że mogę lsofsię dowiedzieć, który proces nasłuchuje na porcie, ale muszę wykonać operację odwrotną.

Dziękuję Ci.

UPD

OS X używa narzędzi BSD, więc mam BSD netstatnie Linuksa netstat. Linux netstatma -popcję wyświetlania PID, BSD netstatużywa -pdo określenia portu i nie ma opcji wyświetlania PID.

shau-kote
źródło
Chcesz powiedzieć, że próbujesz znaleźć porty, na których nasłuchuje proces? netstatmogę to dla ciebie zrobić. Możesz grepna PID, jeśli chcesz filtrować wyjścienetstat
Centimane 22.04.16
także lsofużycie to nie tylko jeden sposób. możesz zrobić coś takiego lsof|grep ${PID}. co z grubsza zrzuci wszystko i grepwybierze linie z PID w nich. W przypadku braku szansy może wyświetlać nieistotną linię, ponieważ numer PID omyłkowo pasuje do innej wartości, ale szanse są znikome
MelBurslan
@Dave, tak, podążasz za mną dobrze. Poza tym, jak widzę, wersja BSD netstatnie może wyświetlać PID-ów.
shau-kote,
@MelBurslan to nie wygląda na schludne rozwiązanie. Co więcej, nie jest szybki - na moim MBP zajmuje trochę czasu.
shau-kote 22.04.16

Odpowiedzi:

13

Sam znalazłem rozwiązanie, czytając je głęboko man lsof. (Tak, RT * M nadal pomaga.) Dzięki @Gilles za celowanie.

Oto rozwiązanie: lsof -aPi -p 555 (555 to PID).

Wyjaśnienie:

  1. -p podać numer PID;
  2. -i wyświetlać tylko urządzenia sieciowe;
  3. -a do AND dwa warunki powyżej (w przeciwnym razie będą ORed);
  4. -P wyświetla numery portów (zamiast domyślnych nazw portów).

Dodatkowo można użyć lsof -aPi4 -p 555lub lsof -aPi6 -p 55dla adresów IPv4 lub IP6 tylko odpowiednio.

Jeśli dane wyjściowe zostaną przeanalizowane przez inny program -Fn, może być pomocna opcja. Dzięki tej opcji lsofwygenerujesz „wyjście dla innego programu” zamiast ładnie sformatowanego wyjścia. lsof -aPi4 -Fn -p 555wyświetli coś takiego:

p554
nlocalhost:4321

PS Wszystko to przetestowałem na moim systemie OS X El Capitan, ale jak widzę, powinno działać również na Linuksie.

shau-kote
źródło
6

lsofzapewnia informacje o plikach otwieranych przez procesy, w tym portach sieciowych. Jest dostępny na prawie wszystkich systemach uniksowych, w tym OSX .

Rosetta Stone dla Unix nie wymienia żadnego innego narzędzia do „procesu pasujące do pliku lub portu” na OSX.

Aby wyświetlić listę procesów nasłuchujących na porcie TCP, możesz użyć

lsof -iTCP -sTCP:LISTEN

lsof -iUDPwyświetla procesy z otwartym gniazdem UDP. lsof -iwyświetla wszystkie otwarte gniazda sieciowe (klienci TCP, serwery TCP i inne protokoły IP).

Gilles „SO- przestań być zły”
źródło
0

jeśli chcesz wiedzieć, który port nasłuchuje, możesz użyć opcji -p netstat. Musisz być superużytkownikiem:

$ sudo netstat -nlp | grep 80
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  125004/nginx

jeśli chcesz dowiedzieć się więcej na ten temat, spróbuj tego linku

Vinood NK Maheshwari
źródło
Chodzi o GNU netstat, mam OS X i dlatego używam BSD netstat. Służy -pdo określania portu TCP / IP i nie ma opcji wyświetlania PID.
shau-kote
0

W FreeBSD możesz użyć sockstattej informacji. Nie jestem pewien, czy OS X sockstat, ponieważ nie mam komputera Mac.

Na przykład, aby zobaczyć wszystkie połączenia TCPv4:

sockstat -4

GROND
źródło
Poza tym sockstatna moim komputerze Mac nie ma polecenia. :(
shau-kote 22.04.16
0

Możesz połączyć netstat z grep, awk i sed, aby wyświetlić porty z odpowiadającymi im pidami w Linux i Cygwin:

$ netstat -ano | grep LISTENING | grep -v ‘\[::\]’ | sort -n | uniq -c | awk ‘ {print $3 “\t” $6}’ | sed ‘s/.*://’

Więcej szczegółów

Atelier Iris
źródło