Frage

Ich bin mit dem Programm Synergie zusammen mit einem SSH-Tunnel

Es funktioniert, ich muss einfach eine Konsole öffnen Sie eine Art, diese beiden Befehle:

ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost

, weil im faul ich machte ein Bash-Script, das mit einem Mausklick auf einem Symbol ausgeführt wird:

#!/bin/bash
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost

die Bash-Script oben funktioniert auch, aber jetzt will ich auch über einen Mausklick Synergie und den SSH-Tunnel töten, so habe ich die PIDs von Synergien und ssh in die Datei zu speichern, um sie zu töten später:

#!/bin/bash

mkdir -p /tmp/synergyPIDs || exit 1
rm -f /tmp/synergyPIDs/ssh || exit 1
rm -f /tmp/synergyPIDs/synergy || exit 1

[ ! -e /tmp/synergyPIDs/ssh ] || exit 1
[ ! -e /tmp/synergyPIDs/synergy ] || exit 1

ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
echo $! > /tmp/synergyPIDs/ssh
synergyc localhost
echo $! > /tmp/synergyPIDs/synergy

Aber die Dateien dieses Skripts sind leer.

Wie erhalte ich die PIDs von ssh und Synergie?
(Ich versuche ps aux | grep ... | awk ... | sed ... Kombinationen zu vermeiden, muss es ein einfacherer Weg sein.)

War es hilfreich?

Lösung 5

Nun, ich möchte nicht ein hinzufügen und somit am Ende der Befehle als die Verbindung sterben wird, wenn die Konsole wintow geschlossen ist ... so endete ich mit einer ps-grep-awk-Sed-Combo bis

ssh -f -N -L localhost:12345:otherHost:12345   otherUser@otherHost
echo `ps aux | grep -F 'ssh -f -N -L localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/ssh
synergyc localhost
echo `ps aux | grep -F 'synergyc localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/synergy

(Sie grep in awk integrieren könnte, aber ich bin jetzt zu faul)

Andere Tipps

Kurze Zusammenfassung:. Funktioniert nicht

Meine erste Idee ist, dass man die Prozesse im Hintergrund starten müssen ihre PIDs mit $! zu erhalten.

Ein Muster wie

some_program &
some_pid=$!
wait $some_pid

könnte das tun, was Sie brauchen ... außer dass dann ssh nicht im Vordergrund stehen für Paßphrasen fragen mehr.

Na, dann könnten Sie etwas anderes brauchen, nachdem alle. ssh -f laicht wahrscheinlich einen neuen Prozess der Shell aus nie wissen, es trotzdem aufrufen. Idealerweise ssh selbst einen Weg bieten würde seine PID in eine Datei.

schreiben

Bei allem Respekt für die Nutzer von pgrep, pkill, ps | awk, etc, gibt es ein viel besserer Weg.

Beachten Sie, dass, wenn Sie auf ps -aux | grep ... verlassen, um einen Prozess finden Sie das Risiko einer Kollision führen. Sie können einen Anwendungsfall, wo das unwahrscheinlich ist, aber in der Regel, es ist nicht der Weg zu gehen.

SSH bietet einen Mechanismus zur Verwaltung und Steuerung von Hintergrundprozessen. Aber wie so viele SSH Dinge, es ist eine „erweiterte“ -Funktion, und viele Menschen (wie es scheint, von den anderen Antworten hier) sind sich nicht bewusst von ihrer Existenz.

In meinem eigenen Gebrauch Fall habe ich einen Arbeitsplatz zu Hause, auf das ich einen Tunnel verlassen will, die in meinem Büro im internen Netzwerk an einen HTTP-Proxy verbindet, und ein anderes, das mir eine schnellen Zugriff auf Management-Schnittstellen über die Zusammenarbeit gibt -Befindet Servern. Dies ist, wie Sie vielleicht die grundlegenden Tunnel erstellen, von zu Hause aus eingeleitet:

$ ssh -fNT -L8888:proxyhost:8888 -R22222:localhost:22 officefirewall
$ ssh -fNT -L4431:www1:443 -L4432:www2:443 colocatedserver

Diese verursachen ssh in den Hintergrund selbst, so dass die Tunnel geöffnet. Aber wenn der Tunnel geht weg, ich bin stecken, und wenn ich es finden will, muß ich meine Prozessliste und nach Hause analysieren habe ich den „richtigen“ ssh bekommen (im Fall habe ich aus Versehen mehr diejenigen ins Leben gerufen, die aussehen ähnlich).

Stattdessen, wenn ich mehrere Verbindungen verwalten möge, verwende ich ControlMaster Konfigurationsoption SSH, zusammen mit der -O Befehlszeilenoption für die Steuerung. Zum Beispiel mit dem folgend in meiner ~/.ssh/config Datei,

host officefirewall colocatedserver
    ControlMaster auto
    ControlPath ~/.ssh/cm_sockets/%r@%h:%p

die ssh über Befehle, wenn ausführen, wird Spoor in ~/.ssh/cm_sockets/ verlassen, die dann Zugang zur Steuerung zur Verfügung stellen können, zum Beispiel:

$ ssh -O check officefirewall
Master running (pid=23980)
$ ssh -O exit officefirewall
Exit request sent.
$ ssh -O check officefirewall
Control socket connect(/home/ghoti/.ssh/cm_socket/ghoti@192.0.2.5:22): No such file or directory

Und an diesem Punkt, der Tunnel (und Controlling SSH-Sitzung) gegangen ist, ohne die Notwendigkeit, einen Hammer zu verwenden (kill, killall, pkill, etc).

bringen diese zurück zu Ihrem Anwendungsfall ...

Sie sind zur Gründung der Tunnel, durch den Sie syngergyc wollen auf TCP-Port 12345. Um das zu erreichen syngergys reden, ich etwas wie das folgende tun würde.

Fügen Sie einen Eintrag auf Ihre ~/.ssh/config-Datei:

Host otherHosttunnel
    HostName otherHost
    User otherUser
    LocalForward 12345 otherHost:12345
    RequestTTY no
    ExitOnForwardFailure yes
    ControlMaster auto
    ControlPath ~/.ssh/cm_sockets/%r@%h:%p

Beachten Sie, dass die Befehlszeile -L Option mit dem LocalForward Stichwort behandelt wird, und die Steuerung {Master-Pfad} Zeilen enthalten sind, um sicherzustellen, dass Sie die Kontrolle haben, nachdem der Tunnel aufgebaut wird.

Dann könnten Sie Ihren Bash-Skript, um so etwas wie dies ändern:

#!/bin/bash

if ! ssh -f -N otherHosttunnel; then
    echo "ERROR: couldn't start tunnel." >&2
    exit 1
else
    synergyc localhost
    ssh -O exit otherHosttunnel
fi

Die -f Option Hintergründe in den Tunnel, eine Buchse an Ihrem ControlPath verlassen später den Tunnel zu schließen. Wenn der ssh ausfällt (was es zu einem Netzwerkfehler oder ExitOnForwardFailure zurückzuführen könnte), gibt es keine Notwendigkeit, den Tunnel zu verlassen, aber wenn es versäumte es nicht, (else), synergyc gestartet wird und dann wird der Tunnel geschlossen wird, nachdem es beendet wird.

Sie mögen vielleicht auch schauen, ob die in SSH Option LocalCommand verwendet werden könnte synergyc von rechts in Ihrer ssh-Konfigurationsdatei zu starten.

kam gerade über diesen Thread und wollte die "pidof" Linux-Dienstprogramm erwähnen:

$ pidof init
1

Sie können lsof verwenden die pid des Prozesses zu Port 12345 auf localhost hören zu zeigen:

lsof -t -i @localhost:12345 -sTCP:listen

Beispiele:

PID=$(lsof -t -i @localhost:12345 -sTCP:listen)
lsof -t -i @localhost:12345 -sTCP:listen >/dev/null && echo "Port in use"

Sie können die -f fallen, die es es im Hintergrund laufen lässt, führen Sie es dann mit eval und zwingen sie, sich in den Hintergrund.

Sie können dann die pid greifen. Achten Sie auf die & innerhalb der eval Anweisung setzen.

eval "ssh -N -L localhost:12345:otherHost:12345 otherUser@OtherHost & " 
tunnelpid=$!

Dies ist eher ein Sonderfall für synergyc (und die meisten anderen Programme, die versuchen, sich zu daemonize). Mit $! funktionieren würde, mit der Ausnahme, dass synergyc einen Klon () syscall während der Ausführung tut, dass es eine neue PID andere als die geben, die bash dachte, es hat. Wenn Sie dies umgehen wollen, so dass Sie !, $ verwenden können, dann können Sie synergyc sagen im forground zu bleiben und dann Hintergrund es.

synergyc -f -n mydesktop remoteip &
synergypid=$!

synergyc hat auch ein paar andere Dinge wie automatische Neustart, die Sie deaktivieren möchten, wenn Sie es schaffen wollen.

Eine weitere Option ist pgrep zu verwenden, um die PID des neuesten ssh Prozess zu finden

ssh -fNTL 8073:localhost:873 otherUser@OtherHost
tunnelPID=$(pgrep -n -x ssh)
synergyc localhost
kill -HUP $tunnelPID

Sie könnten für die ssh proceess achten, die auf Ihrem lokal Port gebunden ist, mit dieser Zeile:

netstat -tpln | grep 127\.0\.0\.1:12345 | awk '{print $7}' | sed 's#/.*##'

Es gibt die PID des Prozesses Port 12345 / TCP auf localhost verwenden. Sie müssen also nicht alle ssh Ergebnisse aus ps filtern.

Wenn Sie nur brauchen, um zu überprüfen, , wenn , dass Port gebunden ist, zu verwenden:

netstat -tln | grep 127\.0\.0\.1:12345 >/dev/null 2>&1

Returns 1 wenn keine gebunden oder 0, wenn jemand an diesen Port abhört.

Basierend auf die sehr gute Antwort von @ghoti, hier ist ein einfacher Skript (zum Testen), um die SSH Steuer Steckdosen , ohne die Notwendigkeit von zusätzlicher Konfiguration verwendet:

#!/bin/bash
if ssh -fN -MS /tmp/mysocket -L localhost:12345:otherHost:12345 otherUser@otherHost; then
    synergyc localhost
    ssh -S /tmp/mysocket -O exit otherHost
fi

synergyc nur dann gestartet wird, wenn Tunnel erfolgreich aufgebaut wurde, der sich, sobald synergyc kehrt geschlossen. Wenn auch die Lösung Reporting korrekte Fehler fehlt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top