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
-f
opçã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
-f
opçã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 $pid
na 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 socat
pode executar até 5 segundos após o ssh
Nota: Na verdade testados usando janela de encaixe, a porta 2375
, /var/run/docker.sock
e 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 -f
bandeira 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 -o
opções podem ser salvas no seu .ssh/config
arquivo ou você pode usar -S (mas ainda precisará -o ControlMaster
)