Określ proces za pomocą portu, bez sudo

11

Chciałbym dowiedzieć się, który proces (w szczególności identyfikator procesu) używa danego portu. Jedynym haczykiem jest to, że nie chcę używać sudo, ani nie jestem zalogowany jako root. Procesy, dla których chcę, aby to działało, są uruchamiane przez tego samego użytkownika, dla którego chcę znaleźć identyfikator procesu - więc pomyślałbym, że to proste.

Oba lsofi netstatnie podadzą mi identyfikatora procesu, chyba że uruchomię je za pomocą sudo - powiedzą mi jednak, że port jest używany.

Jako dodatkowy kontekst - mam różne aplikacje, wszystkie łączące się za pośrednictwem SSH z serwerem, którym zarządzam, i tworząc przekierowanie portów do przodu. Po ich skonfigurowaniu mój serwer wykonuje pewne przetwarzanie przy użyciu przekierowanego portu, a następnie połączenie może zostać przerwane. Jeśli mogę zmapować określone porty (każda aplikacja ma swój własny) na procesy, jest to prosty skrypt. Jakieś sugestie?

Nawiasem mówiąc, jest to na pudełku Ubuntu - ale domyślam się, że każde rozwiązanie będzie standardowe dla większości dystrybucji Linuksa.

poklepać
źródło

Odpowiedzi:

7

--programOpcja netstat pokazuje PID i nazw własnych procesów. Ta opcja jest obecna i działa na RHEL 6 w netstat 1.42 z net-tools 1.60.

Sprawdziłem, że netstat -an --tcp --programpokazuje mi PID moich procesów.

Paweł Brodacki
źródło
1
Myślę, że miałeś na myśli -an. netstat -pantdziała również i łatwiej zapamiętać.
Eduardo Ivanec
Tak, niepotrzebne „-” wkradło się. I podoba mi się mnemonik.
Paweł Brodacki
Obawiam się, że to nie działa na Ubuntu - ponieważ nie pokazuje procesu w niektórych przypadkach bez rootowania - i wydaje się, że przekazywanie SSH jest jednym z takich przypadków.
pat
Paweł: teraz OP w końcu skonkretyzował swój przypadek użycia (patrz komentarz w moim łańcuchu), zachęcam do ponownego wypróbowania. Zrobiłem to na pudełku CentOS 5 (także netstat 1.42 z net-tools 1.60), i to się nie powiedzie, jak mówi. Byłbym zainteresowany twoimi doświadczeniami.
MadHatter
3

Sugestia Pawła wydaje mi się dobrze działać, ale alternatywnie słucham z powłoki 1:

[madhatta@risby ~]$ nc -l  localhost 3456

a oto ja widzę to z lsofshell2:

[madhatta@risby tmp]$ lsof -i tcp:3456
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nc      18109 madhatta    3u  IPv4 69205153      0t0  TCP localhost.localdomain:vat (LISTEN)

Edycja : piszesz w komentarzu, że

Przekazywanie SSH musi zachowywać się inaczej - nawet jeśli proces jest własnością tego samego użytkownika, nie widzę go wcale na liście wyników lsof, chyba że uruchomię go jako root / sudo.

ale dla mnie tak nie jest. Po użyciu ssh do przekazania lokalnego portu 8001, z ssh vpn.example.com -L 8001:rt.int:80, następnie znajduję:

[madhatta@risby ~]$ lsof -n -i tcp:8001
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     5375 madhatta    8u  IPv6 381234      0t0  TCP [::1]:vcom-tunnel (LISTEN)
ssh     5375 madhatta    9u  IPv4 381235      0t0  TCP 127.0.0.1:vcom-tunnel (LISTEN)

Czy mógłbyś nam pokazać niektóre z próbek wyjściowych, najlepiej niezbyt mocno zredagowanych?

Szalony Kapelusznik
źródło
1
Wygląda na to, że przekazywanie SSH musi zachowywać się inaczej - nawet jeśli proces jest własnością tego samego użytkownika, nie widzę go wcale na liście lsofwyników, chyba że uruchomię go jako root / sudo.
pat
Po uruchomieniu jako użytkownik nie otrzymuję żadnego wyjścia lsof na przekierowanym porcie. Jeśli uruchomię go z sudo, zobaczę wynik podobny do tego, co dodałeś do swojej odpowiedzi. Jedyną zauważalną różnicą jest faktyczny numer portu zamiast tunelu vcom.
pat
Jest to także zdalne przekazywanie, a nie przekazywanie lokalne - może to jest różnica? A może testowałeś za pomocą zdalnego przekazywania?
pat
Przez zdalne przekazywanie masz na myśli „z serwera AI ssh na serwer B, przekierowanie portu xxx z serwera B z powrotem na serwer A”? Jeśli tak, to dlaczego miałbyś oczekiwać czegoś z netstat / lsof na serwerze A? W ten sposób nie jest tworzony żaden nowy obiekt nasłuchujący na serwerze A, więc nie ma miejsca przypisanie portu na serwerze A (zapisywanie efemeryczne).
MadHatter
SSH z A do B, port do przodu z portu X na B do portu Y na C (który znajduje się w zaporze A - stąd potrzeba przekazywania), używając lsof / netstat na B dla portu X.
pat