ssh-Tunnel beenden

PhysChemist

Well-Known Member
Hallo,

ich suche eine elegante variante einen ssh-Tunnel zu beenden, wobei einige aufräumarbeiten zuvor zu erledigen sind.

Am liebsten würde ich den Tunnel via 'ssh -f ...' in den Hintergrund schicken, aber dann kann ich ihn nur noch per kill(1) beenden.
Mit einem Shell-Script eine '|&'-Pipe zur Kommunikation zu nutzen würde mir das Beenden ermöglichen, aber dafür geht ssh schon vor einer evt. Passwortabfrage in den Hintergrund.

Hat jemand eine Idee, wie man die Steuerung des Tunnels über einen benannten Socket lösen könnte?

PhysChemist
 
Ahoi,

ich mach sowas mit

SSH="ssh -v -N -f -L ${LOCALHOST}:${LOCALPORT}:${REMOTEHOST}:${REMOTEPORT} ${REMOTELOGIN}"

SSHPID=`ps axww | grep "${SSH}" | grep -v 'grep'

kill ${SSHPID}

Damit kann ich in Scripten SSH-Tunnel aufbauen und wieder beenden.

So long...

Der Indy
 
@indy & @MrFixit

Hallo,

das Problem mit kill(1) ist, das der Tunnel einfach beendet wird. Ich will aber vorher noch ein paar Dateien löschen und eine tun-Konfiguration ändern.

PhysChemist
 
Kannst Du auf dem Server, auf dem Du eingeloggt bist, ein .logout-Script einsetzen?

(Als Softwareentwickler sehe ich hier aber einen massiven Design-Fehler ;-)

So long...

Der Indy
 
Tag,

Es gibt gute Chancen, dass autossh/ auch eine saubere Abschaltung implementiert.
Es handelt sich hierbei um eine Erweiterung für SSH, welche genau auf den Anwendungsfall Tunnel zugeschnitten ist.

Wenn's gut ist, bitte hier posten ;)

PS: Das Problem an Kill -9 ist eher, dass ein Programm darauf nicht mehr reagieren kann und seine Leichenteile nicht selbst wegräumen kann. Zwar werden bei allen modernen Betriebssystemen (außer AmigaOS) fast alle belegten Resourcen wie Filehandles, Speicherbereiche, Sockets usw. immer nach Programmende weggeräumt, so bleiben aber Resourcen wie Shared-RAM, Named-Pipes und Dateisperren (Unix) liegen. Die Resourcen stehen dann nicht mehr zur Verfügung - teilweise sogar nach Booten, da auch über Filesystem-Namen zugegriffen wird. Bei Datenbanken wie Postgres, MySQL oder Oracle fallen solche Nachwirkungen oft auf.
Trotzdem sind Signale nichts Böses, denn kill nur Signale (der Name ist etwas unglücklich gewählt). Programme können und sollen auf Signale reagieren.
 
Zuletzt bearbeitet:
ich habe extra geschrieben man soll erst TERM schicken, wenn ein programm dann nicht schließt, muss man es mit KILL beenden weils kaputt ist.
der kluge ratschlag die binary zu entfernen würde das programm auch nicht stoppen und auch nicht die temp-files entfernen und auch nicht die sockets schließen etc pp.
und wenn man dann den computer runterfährt, rate mal, was mit dem programm passiert das im speicher lungert und nicht auf andere signale reagiert! ... genau, es wird gekillt.
das ist ganz normal, ich hab noch keinen computer davon sterben sehen.
 
Ok,

ich hab's jetzt so gelöst, dass ich erst ssh-agent einen Schlüssel übergeben und dann zwei Fifos verwende

Code:
ssh -L 12345:localhost:54321 <${CTL_IN} >${CTL_OUT} &
cat tunnel.linkup > ${CTL_IN}
....
cat tunnel.linkdown > ${CTL_IN}

das finde ich zwar nicht optimal, aber es funktioniert.

PhysChemist
 
Zurück
Oben