Outra modificação da resposta @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'
Limpador
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 no openssh anterior a 6.7 (como CentOS 7)
- Mata o socat na terminação ssh, em vez de ter que re-ssh no servidor remoto
- Permite login ssh não público (ao contrário da solução ijk)
Característica
- Como a
-fopção não é usada, você pode usar uma chave pública e executar em segundo plano via &ou pode fazer logon interativamente e usar Ctrl + Z e usar o mesmo $!para armazenar o pid.
CONS
- Não é possível usar facilmente a
-fopção ssh, pois você perderá o pid do ssh dessa maneira. Esse método depende da execução em primeiro plano e Ctrl + C para matar.
- Muito mais complicado
Explicação
socat ...& - execute socat em segundo plano no servidor remoto
pid=$! - armazene o pid
trap kill\ $pid 0- executar kill $pidna terminação do bash
while :; sleep... - sente-se em um loop infinito
echo -ne \ \b- Espaço de eco seguido de backspace. Isso falha assim que o ssh é desconectado. Com a sleep 5, isso significa que socatpode executar até 5 segundos após o ssh
Nota: Na verdade testados usando janela de encaixe, a porta 2375, /var/run/docker.socke variável de ambiente DOCKER_HOST='tcp://localhost:2375', mas deve funcionar para todos mysql o mesmo
Atualizar
Usando os controles SSH , você pode usar a -fbandeira do meu jeito, basta adicionar as seguintes bandeiras
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
E você terá
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'
Agora você pode encerrar todas as sessões controladas usando
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
As -oopções podem ser salvas no seu .ssh/configarquivo ou você pode usar -S (mas ainda precisará -o ControlMaster)