Eine weitere Modifikation von @mpontes / @ Javiers Antwort darauf
ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
Reiniger
ssh user@remoteserver -L 9999:localhost:9999 '
socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
pid=$!
trap "kill $pid" 0
while echo -ne " \b"; do
sleep 5
done
'
PROS
- Funktioniert auf openssh früher als 6.7 (wie CentOS 7)
- Beendet socat bei der SSH-Beendigung, anstatt erneut auf den Remote-Server zugreifen zu müssen
- Ermöglicht nicht öffentliches SSH-Login (im Gegensatz zur ijk-Lösung)
Feature
- Da die
-f
Option nicht verwendet wird, können Sie entweder einen öffentlichen Schlüssel verwenden und über im Hintergrund ausführen &
oder sich interaktiv anmelden und Strg + Z verwenden und $!
die PID auf dieselbe Weise speichern.
CONS
- Die
-f
Option ssh kann nicht einfach verwendet werden , da die pid von ssh auf diese Weise verloren geht. Diese Methode basiert auf der Ausführung im Vordergrund und Strg + C zum Beenden.
- Weitaus komplizierter
Erläuterung
socat ...&
- Führen Sie socat im Hintergrund auf einem Remote-Server aus
pid=$!
- Speichern Sie die PID
trap kill\ $pid 0
- Bei kill $pid
Bash-Terminierung ausführen
while :; sleep...
- in einer Endlosschleife sitzen
echo -ne \ \b
- Echo Space gefolgt von Backspace. Dies schlägt fehl, sobald die Verbindung zum ssh getrennt wird. Mit a sleep 5
bedeutet dies, dass socat
bis zu 5 Sekunden nach ssh ausgeführt werden können
Hinweis: Eigentlich getestet mit Docker, Port 2375
, /var/run/docker.sock
und die Umgebungsvariable DOCKER_HOST='tcp://localhost:2375'
, sollte aber für mysql alle die gleiche Arbeit
Aktualisieren
Wenn Sie SSH-Steuerelemente verwenden , können Sie das -f
Flag auf meine Weise verwenden. Fügen Sie einfach die folgenden Flags hinzu
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
Und du wirst bekommen
ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
Jetzt können Sie alle gesteuerten Sitzungen mit beenden
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
Die -o
Optionen können in Ihrer .ssh/config
Datei gespeichert werden, oder Sie können stattdessen -S verwenden (Sie benötigen jedoch weiterhin -o ControlMaster
).