Bestimmen Sie den Prozess mithilfe eines Ports ohne Sudo

11

Ich möchte herausfinden, welcher Prozess (insbesondere die Prozess-ID) einen bestimmten Port verwendet. Der einzige Haken ist, dass ich weder sudo verwenden möchte noch als root angemeldet bin. Die Prozesse, für die dies funktionieren soll, werden von demselben Benutzer ausgeführt, für den ich die Prozess-ID ermitteln möchte. Ich hätte also gedacht, dass dies einfach ist.

Beide lsofund netstatwerden mir die Prozess-ID nicht mitteilen, es sei denn, ich führe sie mit sudo aus - sie werden mir jedoch mitteilen, dass der Port verwendet wird.

Als zusätzlichen Kontext habe ich verschiedene Apps, die alle über SSH eine Verbindung zu einem von mir verwalteten Server herstellen und Reverse-Port-Forwards erstellen. Sobald diese eingerichtet sind, führt mein Server eine Verarbeitung über den weitergeleiteten Port durch, und dann kann die Verbindung unterbrochen werden. Wenn ich bestimmte Ports (jede App hat ihre eigenen) Prozessen zuordnen kann, ist dies ein einfaches Skript. Irgendwelche Vorschläge?

Dies ist übrigens auf einer Ubuntu-Box - aber ich vermute, dass jede Lösung in den meisten Linux-Distributionen Standard sein wird.

klopfen
quelle

Antworten:

7

Die --programOption zu netstat zeigt Ihnen PIDs und Namen Ihrer eigenen Prozesse. Diese Option ist vorhanden und funktioniert mit RHEL 6 in netstat 1.42 von net-tools 1.60.

Ich habe überprüft, ob netstat -an --tcp --programmir die PIDs meiner Prozesse angezeigt werden.

Paweł Brodacki
quelle
1
Ich denke du meintest -an. netstat -pantfunktioniert auch und es ist leichter zu merken.
Eduardo Ivanec
Ja, überflüssiges "-" hat sich eingeschlichen. Und ich mag die Mnemonik.
Paweł Brodacki
Ich befürchte, dass dies unter Ubuntu nicht funktioniert - da es den Prozess in einigen Fällen ohne Root nicht zeigt - und es scheint, dass ein SSH-Forward einer dieser Fälle ist.
Pat
Pawel: Jetzt ist das OP endlich konkret mit seinem Anwendungsfall (siehe Kommentar in meiner Kette). Ich fordere Sie auf, es erneut zu versuchen. Ich habe es auf einer CentOS 5-Box getan (auch netstat 1.42 von net-tools 1.60), und es schlägt fehl, wie er sagt. Ihre Erfahrungen würden mich interessieren.
MadHatter
3

Pawels Vorschlag scheint mir gut zu funktionieren, aber als Alternative höre ich hier von shell1:

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

und hier lsofsehe ich es mit von shell2:

[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)

Bearbeiten : Sie schreiben in einem Kommentar, dass

SSH-Weiterleitungen müssen sich anders verhalten - obwohl der Prozess demselben Benutzer gehört, kann ich ihn in der lsof-Ausgabe nur sehen, wenn ich ihn als root / sudo ausführe.

aber das ist nicht so für mich. Nachdem ich ssh verwendet habe, um den lokalen Port 8001 mit weiterzuleiten ssh vpn.example.com -L 8001:rt.int:80, finde ich dann:

[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)

Könnten Sie uns vielleicht einen Teil Ihrer Beispielausgabe zeigen, vorzugsweise nicht zu stark redigiert?

MadHatter
quelle
1
Es sieht so aus, als müssten sich SSH-Weiterleitungen anders verhalten - obwohl der Prozess demselben Benutzer gehört, kann ich ihn in der lsofAusgabe nur sehen, wenn ich ihn als root / sudo ausführe.
Pat
Ich bekomme überhaupt keine lsof-Ausgabe auf dem weitergeleiteten Port, wenn ich als Benutzer ausgeführt werde. Wenn ich es mit sudo ausführe, sehe ich eine Ausgabe ähnlich der, die Sie Ihrer Antwort hinzugefügt haben. Der einzige bemerkenswerte Unterschied ist, dass ich die tatsächliche Portnummer anstelle von vcom-tunnel sehe.
Pat
Dies ist auch eine Remote-Weiterleitung, keine lokale Weiterleitung - vielleicht ist das die Ursache für den Unterschied? Oder haben Sie mit einer Remote-Weiterleitung getestet?
Pat
Mit Remote-Weiterleitung meinen Sie "von Server AI ssh zu Server B, Port xxx von Server B zurück zu Server A weiterleiten"? Wenn ja, warum sollten Sie erwarten, mit netstat / lsof auf Server A etwas aufzunehmen? Dadurch wird kein neuer Listener auf Server A erstellt, sodass keine Portzuweisung auf Server A erforderlich ist (kurzes Speichern).
MadHatter
SSH von A nach B, Port vorwärts von Port X auf B nach Port Y auf C (der sich innerhalb der Firewall von A befindet - daher die Notwendigkeit der Weiterleitung), unter Verwendung von lsof / netstat auf B für Port X.
Pat