PID eines ssh-Tunnels ermitteln
Servus zusammen, wie kriegt man die PID eines ssh-Tunnels raus? Folgender Code-Schnippel: ssh -CNf -L ... PIDOFSSH="$!" PIDOFSSH ist dann nicht gesetzt. Dafür steht der Tunnel. Notiere ich dagegen: ssh -CN -L ... & PIDOFSSH="$!" Dann ist zwar die PID in PIDOFSSH gespeichert. Aber der Tunnel steht nicht zur Verfügung. Wie geht's richtig? Die PID will ich haben, um den Tunnel später killen zu können, wenn ich ihn nicht mehr brauche. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Thu, 12 May 2011, Andre Tann schrieb:
wie kriegt man die PID eines ssh-Tunnels raus?
$ netstat -p | awk '$NF ~ /ssh/ { sub("/ssh","", $NF); print $NF; }' $ lsof -c ssh | awk '/TCP/{print $2;}' HTH, -dnh -- I have always wished that my computer would be as easy to use as my telephone. My wish has come true. I no longer know how to use my telephone. -- Bjarne Stroustrup -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller, Donnerstag 12 Mai 2011:
wie kriegt man die PID eines ssh-Tunnels raus?
$ netstat -p | awk '$NF ~ /ssh/ { sub("/ssh","", $NF); print $NF; }' $ lsof -c ssh | awk '/TCP/{print $2;}'
Wenn man nur einen Tunnel hat. Wenn man aber, wie ich häufig, x Tunnel irgendwohin hat, und nur einen bestimmten killen will? $ lsof -c ssh | awk '/TCP/ {print $2}' | sort -u | wc -l 11 -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Andre Tann wrote:
David Haller, Donnerstag 12 Mai 2011:
wie kriegt man die PID eines ssh-Tunnels raus?
$ netstat -p | awk '$NF ~ /ssh/ { sub("/ssh","", $NF); print $NF; }' $ lsof -c ssh | awk '/TCP/{print $2;}'
Wenn man nur einen Tunnel hat. Wenn man aber, wie ich häufig, x Tunnel irgendwohin hat, und nur einen bestimmten killen will?
$ lsof -c ssh | awk '/TCP/ {print $2}' | sort -u | wc -l 11
Tja, die gute alte "brute force" Keule müsste doch gehen (da die Kombination hinter "-L" auf einer Maschine uniq sein muss, oder? ps -fu $USER|grep "${-L params}"| ... (Rest kannst Du selber) geht. Nicht super toll, aber: geht Andreas -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Kyek, Andreas, VF-DE, Donnerstag 12 Mai 2011:
Tja, die gute alte "brute force" Keule müsste doch gehen (da die Kombination hinter "-L" auf einer Maschine uniq sein muss, oder?
ps -fu $USER|grep "${-L params}"| ... (Rest kannst Du selber)
geht. Nicht super toll, aber: geht
Ja, genau so dachte ich auch: nicht toll, aber zur Not muß es halt so gehen. Und in der Tat - das hinter -L muß natürlich eindeutig sein, und so gesehen ist der Weg schon OK. Aber gibts da nicht einen netteren Bash-Trick? Ich kapier nicht genau, warum ssh mir die PID nicht verraten will. Und auch nicht, warum der Tunnel nicht bestehen bleibt, wenn ich das ssh ohne -f, stattdessen mit & in den Hintergrund schicke. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Andre Tann wrote:
Kyek, Andreas, VF-DE, Donnerstag 12 Mai 2011:
Tja, die gute alte "brute force" Keule müsste doch gehen (da die Kombination hinter "-L" auf einer Maschine uniq sein muss, oder?
ps -fu $USER|grep "${-L params}"| ... (Rest kannst Du selber)
geht. Nicht super toll, aber: geht
Ja, genau so dachte ich auch: nicht toll, aber zur Not muß es halt so gehen. Und in der Tat - das hinter -L muß natürlich eindeutig sein, und so gesehen ist der Weg schon OK.
Aber gibts da nicht einen netteren Bash-Trick? Ich kapier nicht genau, warum ssh mir die PID nicht verraten will.
Aus "man bash" Special Parameters ! Expands to the process ID of the most recently executed background (asynchronous) command Tja, mit "-f" wird aber kein Background Prozess initiiert, der als "child" an der shell hängt sondern ssh hängt am root-prozess. Damit bleibt "$!" natürlich leer.
Und auch nicht, warum der Tunnel nicht bestehen bleibt, wenn ich das ssh ohne -f, stattdessen mit & in den Hintergrund schicke.
definiere "bestehen bleibt"? Wenn ich einen Tunnel aus der laufenden Shell mit & in den Hintergrund geschickt starte ist der Tunnel da und bleibt da; beende ich die aufrufende Shell hängt sich der Tunnel wieder an die "root". Zumindest ist das hier in einem Bash-Fensterchen so. Und dieser immer noch laufende Tunnel ist für die Applikation nutzbar. (Getestet auf meinem client mit OS 11.4-64 gegen einen OS 11.3-i386 Server) Andreas -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Moin zusammen, Kyek, Andreas, VF-DE, Donnerstag 12 Mai 2011:
Und auch nicht, warum der Tunnel nicht bestehen bleibt, wenn ich das ssh ohne -f, stattdessen mit & in den Hintergrund schicke.
definiere "bestehen bleibt"?
Ganz einfach: [lange Erklärung getippt] Mann, jetzt ist es mir klar, ich muß natürlich warten, bis der Tunnel steht. Ein ssh -L ... & macht natürlich sofort weiter, und da lebt der Tunnel noch nicht, wenn ich ihn gleich verwenden will. Nicht: nicht mehr. Danke für die ... äh, Hilfestellung. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Thu, 12 May 2011, Andre Tann schrieb:
David Haller, Donnerstag 12 Mai 2011:
wie kriegt man die PID eines ssh-Tunnels raus?
$ netstat -p | awk '$NF ~ /ssh/ { sub("/ssh","", $NF); print $NF; }' $ lsof -c ssh | awk '/TCP/{print $2;}'
Wenn man nur einen Tunnel hat. Wenn man aber, wie ich häufig, x Tunnel irgendwohin hat, und nur einen bestimmten killen will?
$ lsof -c ssh | awk '/TCP/ {print $2}' | sort -u | wc -l 11
Schau dir mal die Ausgabe von 'lsof -c ssh | grep TCP' an. Dämmerts? $ host=HOSTNAME[.DOMAIN.TLD] $ lsof -c ssh | awk -F'[> \t]+' -vhost="$host" \ '/TCP/ && $(NF-1) ~ host { print $2; }' Wenn du statt 'print $2' 'print' verwendest siehst du, daß richtig gefiltert wird. Du kannst natürlich -vhost direkt setzen awk -F'[> \t]+' -vhost="foo" \ vom Umquoten des awk-Befehls rate ich ab, das wird schnell häßlich, sobald du z.B. dort Strings verwenden willst: "/TCP/ && $(NF-1) ~ /$host/ { print \"pid of ssh to $host: \" $2 ; }" besonders auch in den Argumenten von sub(), gsub(), gensub() und print[f]. Also lieber per '-v' die Variablen an awk übergeben. -dnh -- Wenn alle Stricke reißen ... da kann man sich nicht mal mehr aufhängen. -- Marc-Uwe Kling, bei Volker Pispers, April 2008 -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller, Donnerstag 12 Mai 2011:
Schau dir mal die Ausgabe von 'lsof -c ssh | grep TCP' an. Dämmerts?
Nö, dämmert mir nicht. $ lsof -c ssh | awk -F'[> \t]+' -vhost="$host" '/TCP/ && $(NF-1) ~ host { print ; }' ssh 7681 atann 3u IPv4 471342 0t0 TCP Device-535DD4:33127->HOSTNAME:ssh (ESTABLISHED) ssh 7783 atann 3u IPv4 474263 0t0 TCP Device-535DD4:35650->HOSTNAME:ssh (ESTABLISHED) ssh 7791 atann 3u IPv4 474311 0t0 TCP Device-535DD4:35651->HOSTNAME:ssh (ESTABLISHED) Ich habe also drei Tunnel etabliert. Und ich will nur einen davon abschießen, weil die anderen beiden woanders hin gehören. Wie also kriege ich raus, welches derjenige ist, den ich zuvor aufgebaut habe? Nebenan bin ich aber ja schon auf meinen Fehler gekommen. Ein ssh -f ... kommt erst zurück, wenn der Tunnel steht, während ein ssh ... & sofort zurückkommt. Ich muß also anschließend warten, bis der Tunnel nutzbar ist. Das war mein Fehler. Ich hatte nicht gewartet und dachte, der Tunnel sei wieder weg. Dabei war er noch nicht da. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Sun, 15 May 2011, Andre Tann schrieb:
David Haller, Donnerstag 12 Mai 2011:
Schau dir mal die Ausgabe von 'lsof -c ssh | grep TCP' an. Dämmerts?
Nö, dämmert mir nicht.
$ lsof -c ssh | awk -F'[> \t]+' -vhost="$host" '/TCP/ && $(NF-1) ~ host { print ; }' ssh 7681 atann 3u IPv4 471342 0t0 TCP Device-535DD4:33127->HOSTNAME:ssh (ESTABLISHED) ssh 7783 atann 3u IPv4 474263 0t0 TCP Device-535DD4:35650->HOSTNAME:ssh (ESTABLISHED) ssh 7791 atann 3u IPv4 474311 0t0 TCP Device-535DD4:35651->HOSTNAME:ssh (ESTABLISHED)
Ich habe also drei Tunnel etabliert. Und ich will nur einen davon abschießen, weil die anderen beiden woanders hin gehören. Wie also kriege ich raus, welches derjenige ist, den ich zuvor aufgebaut habe?
Aber du siehst jew. den Hostnamen. Daß du 3 Tunnels zu einem Rechner aufbaust hast du nicht erwähnt. Du kannst dann nur noch die PIDs angucken. Die höchste ist meist der zuletzt erstellte. Du könntest auch noch in /proc/PID/cwd das Working-Dir angucken. Oder dann mit ps gucken, wann du welche aufgerufen hast: ps ef -o pid,lstart,cmd p $( lsof -c ssh | \ awk -F'[> \t]+' -vhost="$host" \ '/TCP/ && $(NF-1) ~ host { printf "%s ", $2;}' ) Wenn du das ",cmd" hinter -o weglässt bekommst du nur noch PID und Startzeit. Damit solltest du die Tunnel dann identifizieren können. Mit pid,tname,lstart,cmd hättest du z.B. noch das Terminal (soweit diese ssh eins haben) ... Siehe man ps nach weiteren Möglichkeiten. -dnh -- I do not have enough Scotch in this house to attempt an XP install. -- Peter Corlett -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (3)
-
Andre Tann
-
David Haller
-
Kyek, Andreas, VF-DE