Como fechar esse túnel ssh? [fechadas]

94

Abri um túnel ssh conforme descrito neste post: Zend_Db: Como se conectar a um banco de dados MySQL através do túnel SSH?

Mas agora não sei o que realmente fiz. Este comando afeta alguma coisa no servidor? E como faço para fechar este túnel, porque agora não posso usar meu mysql local corretamente.

Eu uso o OSX Lion e o servidor roda no Ubuntu 11.10.

Jacob
fonte

Respostas:

239

Supondo que você executou este comando: ssh -f [email protected] -L 3306:mysql-server.com:3306 -Nconforme descrito na postagem que você vinculou.

Uma análise do comando:

  1. ssh: isso é bastante autoexplicativo. Invoca ssh.
  2. -f: (Da man sshpágina)

    Solicita que ssh vá para segundo plano antes da execução do comando. Isso é útil se o ssh vai pedir senhas ou frases-senha, mas o usuário quer em segundo plano.

    Essencialmente, envie sshpara segundo plano depois de inserir qualquer senha para estabelecer a conexão; ele retorna o prompt do shell para você em em localhostvez de fazer o login no remote-host.

  3. [email protected]: o servidor remoto no qual deseja fazer login.
  4. -L 3306:mysql-server.com:3306: Esta é a parte interessante. -L(da man sshpágina):

    [bind_address:] port: host: hostport Especifica que a porta fornecida no host local (cliente) deve ser encaminhada para o host e a porta fornecidos no lado remoto.

    Assim, -L 3306:mysql-server.com:3306liga a porta local3306 à porta remota 3306 no host mysql-server.com.

    Quando você se conecta à porta local3306 , a conexão é encaminhada pelo canal seguro para mysql-server.com. O host remoto , mysql-server.comem seguida, conecta-se mysql-server.comna porta 3306.

  5. -N: não execute um comando. Isso é útil para "apenas encaminhar portas" (citando a página do manual).

Este comando afeta alguma coisa no servidor?

Sim, ele estabelece uma conexão entre localhost e mysql-server.com na porta 3306 .

E como faço para fechar este túnel ...

Se você já usou -f, notará que o sshprocesso que você abriu fica em segundo plano. O método mais agradável de fechá-lo é executar ps aux | grep 3306, encontrar o pidde ssh -f ... -L 3306:mysql-server.com:3306 -N, e kill <pid>. (Ou talvez kill -9 <pid>; esqueci se apenas killfunciona). Isso tem o belo benefício de não matar todas as suas outras sshconexões; se você tem mais de um, restabelecê-los pode ser uma pequena ... dor.

... porque agora não consigo usar meu mysql local corretamente.

Isso ocorre porque você efetivamente "capturou" o processo local mysql e encaminhou para o processo remoto qualquer tráfego que tentasse se conectar a ele mysql. Uma solução muito mais agradável seria não usar a porta local 3306 no encaminhamento de porta. Use algo que não seja usado, como 33060. (Números mais altos geralmente são menos usados; é muito comum encaminhar uma combinação como esta: "2525-> 25", "8080-> 80", "33060-> 3306" ou semelhante. Torna a lembrança um pouco mais fácil).

Então, se você usou ssh -f [email protected] -L 33060:mysql-server.com:3306 -N, você apontaria sua função Zend connect-to-mysql para uma localhostporta 33060, que se conectaria a uma mysql-server.comporta 3306. Obviamente , você ainda pode se conectar a uma localhostporta 3306, portanto, ainda pode usar o mysqlservidor local .

simont
fonte
4
A melhor explicação que li há algum tempo. Isso é muito útil ao acessar um banco de dados remoto de ambientes instalados localmente como R, por exemplo. Funciona bem com autenticação de chave pública / privada. Não com senhas porque não encontrei uma maneira de passá-las.
Matt Bannert
Aceitando esta resposta da melhor maneira por causa da explicação completa.
Jacob
Boa resposta! Aliás, -9não é necessário kill, considerando que o processo ainda está funcionando bem ;-)
Lucio Paiva
46

Isso irá matar todas as sessões ssh que você abriu no terminal.

sudo killall ssh
então retém
fonte
'Nenhum processo correspondente foi encontrado', diz.
Jacob
Parece que sim. O Mysql também funcionou bem, mas o Apache começou a reclamar. Fiz uma reinicialização e tudo funciona conforme o esperado. Problema resolvido, eu acho :)
Jacob
5
Bem, você não quer fazer isso se for um ambiente de produção ... você vai expulsar todos os outros administradores
texasbruce
12
Correr killall sshé um comando bastante imprudente. Aconselho pesquisar sua lista de processos (ou seja, ps aux | grep sshcomo sugerido por @simont acima) para descobrir a id de processo específica do seu processo de túnel ssh. Então você pode matar o pid especificamente.
Ben
Há uma boa chance de você não querer que todos eles sejam mortos.
wobbily_col
21

Nota: adicionar como resposta, pois os comentários não suportam blocos de código.

Na minha opinião, é melhor NÃO usar -fe, em vez disso, apenas colocar em segundo plano o processo normalmente &. Isso lhe dará o pid exato que você precisa matar:

ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid

Ou melhor ainda, apenas crie isso como um script de wrapper:

# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid

backend-tunnel mysql-workbench

backend-tunnel bash

Aaron
fonte
12
Usar -fpermite que a sshsessão continue mesmo quando a sessão do terminal é fechada, ao contrário de empurrar para segundo plano. Compreender o piduso ps aux | grep ssh | grep <LOCAL-PORT>é bastante trivial.
simont
1
@simont usar o pid explícito retornado do trabalho em segundo plano é mais seguro, independentemente de como você o colocou em segundo plano. se você tiver mais de um processo ssh em execução, você terá um péssimo momento
Aaron
O uso -ftambém tem a vantagem de solicitar ao usuário local a senha de login, se necessário. Se você usar &, esse prompt não será visto pelo usuário, a menos que ele traga o processo para o primeiro plano (por exemplo, usando fg).
Bdoserror
3
a primeira vez que seu <LOCAL-PORT> ocorre no pid de um processo que também contém o texto 'ssh' (como outro processo ssh ou sshd ou editando um arquivo com 'ssh' no nome) você perceberá que isso abordagem, embora conveniente em cenários simples, não é à prova de balas
aaron