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.

Respostas:


239

Supondo que você executou este comando: ssh -f user@mysql-server.com -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. user@mysql-server.com: 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 user@mysql-server.com -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 .


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

'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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.