Une autre modification de la réponse de @mpontes / @ javier qui
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'
Nettoyeur
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
'
AVANTAGES
- Fonctionne sur openssh antérieur à 6.7 (comme CentOS 7)
- Tue socat lors de la terminaison ssh au lieu d'avoir à relancer ssh dans le serveur distant
- Permet une connexion ssh non publique (contrairement à la solution ijk)
Fonctionnalité
- Étant donné que l'
-f
option n'est pas utilisée, vous pouvez soit utiliser une clé publique et exécuter en arrière-plan via, &
soit vous connecter de manière interactive et utiliser Ctrl + Z et l'utiliser $!
pour stocker le pid.
LES INCONVÉNIENTS
- Impossible d'utiliser facilement l'
-f
option ssh, car vous perdrez le pid de ssh de cette façon. Cette méthode repose sur l'exécution au premier plan et sur Ctrl + C pour tuer.
- Beaucoup plus compliqué
Explication
socat ...&
- exécuter socat en arrière-plan sur le serveur distant
pid=$!
- stocker le pid
trap kill\ $pid 0
- exécuter kill $pid
sur la terminaison bash
while :; sleep...
- asseyez-vous dans une boucle infinie
echo -ne \ \b
- Espace d'écho suivi d'un retour arrière. Cela échoue dès que le ssh est déconnecté. Avec un sleep 5
, cela signifie que socat
peut s'exécuter jusqu'à 5 secondes après ssh
Remarque: En fait , testé à l' aide docker, le port 2375
, /var/run/docker.sock
et variable d'environnement DOCKER_HOST='tcp://localhost:2375'
, mais devrait fonctionner pour mysql tous les mêmes
Mise à jour
En utilisant les contrôles SSH , vous pouvez utiliser le -f
drapeau à ma façon, ajoutez simplement les drapeaux suivants
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
Et vous obtiendrez
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'
Vous pouvez maintenant terminer toutes les sessions contrôlées à l'aide de
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
Les -o
options peuvent être enregistrées dans votre .ssh/config
fichier, ou vous pouvez utiliser -S à la place (mais vous en aurez toujours besoin -o ControlMaster
)