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.

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.


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?


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.