Dragonfly85
Anmeldungsdatum: 3. November 2012
Beiträge: 67
|
Hallo, ich suche eine Möglichkeit, eventuell mit einem Skript, dass mir folgende Aufgabe eleganter löst. Derzeit mache ich es so: Zuerst öffne ich einen Tunnel: | ssh -CTD localhost:LOKALER_PORT USER@SERVER -pSERVER_PORT
|
Dann starte ich das Programm:
Das funktioniert einwandfrei, jetzt würde ich mir nur mehr Komfortwünschen und zwar wenn ich Midori starte sollte sich zuerst der Tunnel starten und nach erfolgreichem Verbindungsaufbau soll er Midori starten bzw. wenn Midori beende wird sollte sich auch der Tunnel beenden.
|
MPW
Anmeldungsdatum: 4. Januar 2009
Beiträge: 3729
|
Hallo, was spricht denn dagegen die beiden Befehle in ein Skript zu stopfen? ssh -f -CTD localhost:LOKALER_PORT USER@SERVER -pSERVER_PORT
tsocks midori Siehe dazu auch man ssh:
-f Requests ssh to go to background just before command execution.
This is useful if ssh is going to ask for passwords or
passphrases, but the user wants it in the background. This
implies -n. The recommended way to start X11 programs at a
remote site is with something like ssh -f host xterm.
If the ExitOnForwardFailure configuration option is set to “yes”,
then a client started with -f will wait for all remote port for‐
wards to be successfully established before placing itself in the
background. Diese Option solltest du also aktivieren. Wenn du Host und Port variabel halten möchtest, einfach als Parameter übergeben und abrufen: ssh -f -CTD localhost:$1 $2@$3 -p$4 Grüße
MPW
|
Dragonfly85
(Themenstarter)
Anmeldungsdatum: 3. November 2012
Beiträge: 67
|
MPW schrieb: Hallo, was spricht denn dagegen die beiden Befehle in ein Skript zu stopfen? ssh -f -CTD localhost:LOKALER_PORT USER@SERVER -pSERVER_PORT
tsocks midori Siehe dazu auch man ssh:
-f Requests ssh to go to background just before command execution.
This is useful if ssh is going to ask for passwords or
passphrases, but the user wants it in the background. This
implies -n. The recommended way to start X11 programs at a
remote site is with something like ssh -f host xterm.
If the ExitOnForwardFailure configuration option is set to “yes”,
then a client started with -f will wait for all remote port for‐
wards to be successfully established before placing itself in the
background. Diese Option solltest du also aktivieren. Wenn du Host und Port variabel halten möchtest, einfach als Parameter übergeben und abrufen: ssh -f -CTD localhost:$1 $2@$3 -p$4 Grüße
MPW
Soweit ich das verstanden habe (leider ist mein Englisch leicht mangelhaft) wird mit der "-f" Option der Tunnel nur in den Hitergrund gesetzt, das erreicht man auch einfach mit "&", das ist mir klar. Nur wenn ich danach Midori beende bleibt der Tunnel offen, das wäre alles kein Problem wenn der Tunnel sich irgendwie erneut verbinden würde. Wenn er die Verbindung verloren hat, tut er das aber nicht. Er blockiert den Port und das Skript würde erst wieder nach einem Neustart gehen. Deshalb sollte das Skript nach Beenden von Midori den Tunnel wieder schließen, nur weiß ich leider nicht wie ich das machen soll. Mein derzeitiger Versuch sieht so aus: | #!/bin/bash
ssh -fCTD localhost:$1 $2@$3 -p$4
PID=$! &&
tsocks midori
bash
kill $PID
|
Als Fehlermeldung bekomme ich: | Cannot fork into background without a command to execute.
|
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
Dragonfly85 schrieb: Als Fehlermeldung bekomme ich: | Cannot fork into background without a command to execute.
|
Versuch mal mit:
ssh -CTD localhost:$1 $2@$3 -p$4 -f sleep 1d
|
Dragonfly85
(Themenstarter)
Anmeldungsdatum: 3. November 2012
Beiträge: 67
|
lubux schrieb: Dragonfly85 schrieb: Als Fehlermeldung bekomme ich: | Cannot fork into background without a command to execute.
|
Versuch mal mit:
ssh -CTD localhost:$1 $2@$3 -p$4 -f sleep 1d
Ok, Danke jetzt funktioniert der Tunnel, aber er wird wieder nicht beendet und bleibt einfach offen ☹
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
Dragonfly85 schrieb: ..., aber er wird wieder nicht beendet und bleibt einfach offen ☹
Wann soll der Tunnel beendet werden?
|
Dragonfly85
(Themenstarter)
Anmeldungsdatum: 3. November 2012
Beiträge: 67
|
wenn ich bei Midori auf "X" drücke bzw. wenn Midori beendet wird.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
Dragonfly85 schrieb: wenn ich bei Midori auf "X" drücke bzw. wenn Midori beendet wird.
Wie ist vorher die Ausgabe von:
ps -fC ssh
und führe dein Script mal mit:
sh -x <dein-Script>
aus.
|
Dragonfly85
(Themenstarter)
Anmeldungsdatum: 3. November 2012
Beiträge: 67
|
lubux schrieb:
Wie ist vorher die Ausgabe von:
ps -fC ssh
| USER@USER ~ $ ps -fC ssh
UID PID PPID C STIME TTY TIME CMD
USER 3936 3871 0 08:52 pts/2 00:00:00 /bin/bash ./ssh
USER 4020 3985 0 08:53 pts/2 00:00:00 /bin/bash ./ssh
USER 4075 4059 0 08:54 pts/2 00:00:00 /bin/bash ./ssh
USER 5210 4113 0 09:59 pts/2 00:00:00 /bin/bash ./ssh
USER 5213 1 0 09:59 ? 00:00:00 ssh -CTD localhost:***** -f sleep 1d
|
habe danach einfach
eingegeben und dann ist der Tunnel endlich wieder geschlossen. lubux schrieb: und führe dein Script mal mit:
sh -x <dein-Script>
aus.
| USER@USER ~ $ sh -x ./ssh
+ ssh -CTD localhost:***** -f sleep 1d
+ PID=
+ tsocks midori
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.6) (7u51-2.4.6-1ubuntu4)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
+ bash
|
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
Was sind das (./ssh) für aktive Scripte (mit unterschiedlichen PIDs)? BTW: ssh ist kein so guter Name für ein Script. Dragonfly85 schrieb: USER@USER ~ $ ps -fC ssh
UID PID PPID C STIME TTY TIME CMD
USER 3936 3871 0 08:52 pts/2 00:00:00 /bin/bash ./ssh
USER 4020 3985 0 08:53 pts/2 00:00:00 /bin/bash ./ssh
USER 4075 4059 0 08:54 pts/2 00:00:00 /bin/bash ./ssh
USER 5210 4113 0 09:59 pts/2 00:00:00 /bin/bash ./ssh
USER 5213 1 0 09:59 ? 00:00:00 ssh -CTD localhost:***** -f sleep 1d USER@USER ~ $ sh -x ./ssh
+ ssh -CTD localhost:***** -f sleep 1d
+ PID=
+ tsocks midori
PID ist "leer". Was soll dein Script killen?
|
Dragonfly85
(Themenstarter)
Anmeldungsdatum: 3. November 2012
Beiträge: 67
|
lubux schrieb: Was sind das (./ssh) für aktive Scripte mit unterschiedlichen PIDs? BTW: ssh ist kein so guter Name für ein Script. Dragonfly85 schrieb: USER@USER ~ $ ps -fC ssh
UID PID PPID C STIME TTY TIME CMD
USER 3936 3871 0 08:52 pts/2 00:00:00 /bin/bash ./ssh
USER 4020 3985 0 08:53 pts/2 00:00:00 /bin/bash ./ssh
USER 4075 4059 0 08:54 pts/2 00:00:00 /bin/bash ./ssh
USER 5210 4113 0 09:59 pts/2 00:00:00 /bin/bash ./ssh
USER 5213 1 0 09:59 ? 00:00:00 ssh -CTD localhost:***** -f sleep 1d USER@USER ~ $ sh -x ./ssh
+ ssh -CTD localhost:***** -f sleep 1d
+ PID=
+ tsocks midori
PID ist "leer". Was soll dein Script killen?
Ja, im obigem Fall PID=5213, dass heist das Skript bekommt die Tunnel-PID nicht, was habe ich falsch gemacht, eigentlich sollte es ja die PID vom Tunnel zwischengespeichern. Habe es gerade gemerkt und umbenannt:
Diese ssh-Skripte sind vermutlich durch meine Versuche von vorher, ich kill die mal alle.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
Dragonfly85 schrieb: Ja, im obigem Fall PID=5213, dass heist das Skript bekommt die Tunnel-PID nicht, was habe ich falsch gemacht, eigentlich sollte es ja die PID vom Tunnel zwischengespeichern.
Versuch mal mit:
PID=$(pidof ssh)
|
Dragonfly85
(Themenstarter)
Anmeldungsdatum: 3. November 2012
Beiträge: 67
|
lubux schrieb: Dragonfly85 schrieb: Ja, im obigem Fall PID=5213, dass heist das Skript bekommt die Tunnel-PID nicht, was habe ich falsch gemacht, eigentlich sollte es ja die PID vom Tunnel zwischengespeichern.
Versuch mal mit:
PID=$(pidof ssh)
Danke jetzt gehts, hier noch mal für interessierte Leser mein fertiges Skript: | #!/bin/bash
ssh -CTD localhost:LOKALER_PORT USER@SERVER -pSERVER_PORT -f sleep 1d
PID=$(pidof ssh)
tsocks midori
kill $PID
|
|
MPW
Anmeldungsdatum: 4. Januar 2009
Beiträge: 3729
|
Statt ein sleep 1d kann man viel eleganter noch die Option -N anhängen, dann geht's auch ohne Befehl.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13938
|
MPW schrieb: ... viel eleganter noch die Option -N anhängen, ...
OK, aber -N hat auch die Einschränkung:
Do not execute a remote command. EDIT: BTW: Mit sleep wird gleichzeitig auch festgelegt, für welche Zeitdauer der ssh-Tunnel besteht bzw. wie lang die Verbindung offen bleibt.
|