Otra modificación de la respuesta de @mpontes '/ @ javier que
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'
Limpiador
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
- Funciona en openssh anterior a 6.7 (como CentOS 7)
- Mata socat en la terminación ssh en lugar de tener que volver a ssh en el servidor remoto
- Permite el inicio de sesión ssh no público (a diferencia de la solución ijk)
Característica
- Como
-fno se usa la opción, puede usar una clave pública y ejecutarla en segundo plano a través de &o puede iniciar sesión de forma interactiva y usar Ctrl + Z y usar la misma $!para almacenar el pid.
CONTRAS
- No se puede usar fácilmente la
-fopción ssh, ya que perderá el pid de ssh de esa manera. Este método se basa en ejecutarse en primer plano y Ctrl + C para matar.
- Mucho más complicado
Explicación
socat ...& - ejecutar socat en segundo plano en el servidor remoto
pid=$! - almacenar el pid
trap kill\ $pid 0- ejecutar kill $piden terminación bash
while :; sleep... - sentarse en un bucle infinito
echo -ne \ \b- Espacio de eco seguido de retroceso. Esto falla tan pronto como se desconecta el ssh. Con un sleep 5, esto significa que socatpuede ejecutarse hasta 5 segundos después de ssh
Nota: En realidad probado usando cargador de muelle, puerto 2375, /var/run/docker.socky la variable de entorno DOCKER_HOST='tcp://localhost:2375', pero debería funcionar para todos el mismo MySQL
Actualizar
Usando los controles SSH , puede usar la -fbandera a mi manera, solo agregue las siguientes banderas
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
Y obtendrás
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'
Ahora puede terminar todas las sesiones controladas usando
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
Las -oopciones se pueden guardar en su .ssh/configarchivo, o puede usar -S en su lugar (pero aún lo necesitará -o ControlMaster)