Un'altra modifica della risposta di @mpontes / @ javier
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'
addetto alle pulizie
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
'
PROFESSIONISTI
- Funziona su openssh prima della 6.7 (come CentOS 7)
- Uccide socat sulla terminazione ssh invece di dover re-ssh nel server remoto
- Consente l'accesso ssh non pubblico (diversamente dalla soluzione ijk)
caratteristica
- Poiché l'
-f
opzione non viene utilizzata, è possibile utilizzare una chiave pubblica ed eseguire in background tramite &
oppure è possibile accedere in modo interattivo e utilizzare Ctrl + Z e utilizzare lo stesso $!
per memorizzare il pid.
CONS
- Non puoi usare facilmente l'
-f
opzione ssh, poiché perderai il pid di ssh in quel modo. Questo metodo si basa sull'esecuzione in primo piano e Ctrl + C per uccidere.
- Molto più complicato
Spiegazione
socat ...&
- eseguire socat in background sul server remoto
pid=$!
- memorizza il pid
trap kill\ $pid 0
- eseguire kill $pid
su bash terminazione
while :; sleep...
- sedersi in un ciclo infinito
echo -ne \ \b
- Spazio eco seguito da backspace. Questo fallisce non appena l'ssh viene disconnesso. Con a sleep 5
, questo significa che socat
può funzionare fino a 5 secondi dopo ssh
Nota: In realtà testati utilizzando finestra mobile, la porta 2375
, /var/run/docker.sock
e la variabile ambiente DOCKER_HOST='tcp://localhost:2375'
, ma dovrebbe funzionare per mysql tutti uguali
Aggiornare
Usando i controlli SSH , puoi usare la -f
bandiera a modo mio, basta aggiungere le seguenti bandiere
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
E otterrai
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'
Ora puoi terminare tutte le sessioni controllate usando
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
Le -o
opzioni possono essere salvate nel tuo .ssh/config
file oppure puoi usare -S invece (ma avrai comunque bisogno -o ControlMaster
)