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
-f
no 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
-f
opció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 $pid
en 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 socat
puede ejecutarse hasta 5 segundos después de ssh
Nota: En realidad probado usando cargador de muelle, puerto 2375
, /var/run/docker.sock
y 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 -f
bandera 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 -o
opciones se pueden guardar en su .ssh/config
archivo, o puede usar -S en su lugar (pero aún lo necesitará -o ControlMaster
)