Como gerenciar túneis como processos em segundo plano a partir de um script de shell?

19

Preciso configurar alguns túneis ssh a partir de um script de shell. Eu tentei executá-los como tarefas bg usando:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

mas os túneis não parecem funcionar corretamente quando eu os inicio dessa maneira.

Eles funcionam bem quando eu os configuro manualmente em suas próprias guias, então minha próxima idéia é fazer com que o script abra novas guias no Terminal e execute os comandos como processos em primeiro plano.

Nota: esta pergunta era originalmente "Como inicio uma nova guia de terminal do shell e, em seguida, execute um comando nele?", Mas recebi duas respostas sobre como lidar com os túneis. Para a pergunta "abrindo um shell", encontrei isso no SuperUser , que funcionará, embora novas guias em segundo plano sejam preferíveis às janelas de primeiro plano que são abertas.

sprugman
fonte
Você mantém uma sessão SSH ativa no servidor? Ou seja, você tem seus túneis em segundo plano e uma sessão SSH em primeiro plano em que realmente trabalha?
31411 Jack M.
Até agora, mantive três abas abertas: uma para cada túnel e outra para qualquer que seja. A maior parte do meu trabalho real ocorre no Eclipse e em um navegador.
sprugman 01/09/11
(Os túneis são apenas para que eu possa acessar alguns dbs remotos de minha instância local Tomcat.)
sprugman

Respostas:

25

Tecnicamente, isso não é uma resposta à pergunta, mas uma resposta ao seu problema, conforme descrito. O comando ssh possui dois comutadores que podem ser úteis para você:

ssh -f -N -L 3000:server1:5029 me@server2

diz ao ssh para ficar em primeiro plano apenas o tempo suficiente para solicitar as senhas necessárias e depois se colocar em segundo plano, não executando nenhum comando remoto, mas apenas manipulando o túnel.

Se você realmente deseja que isso apareça em uma guia, convém uma solução diferente.

zzz
fonte
Eu configurei chaves, para não precisar digitar senhas, mas isso parece funcionar. Obrigado! Uma pergunta: como faço para acessar os túneis para ver se eles atingiram o tempo limite, para encerrá-los etc.? Nem jobsnem pslistas de um identificador para eles ....
sprugman
2
O ps -wwajx | grep ssh deve mostrar os processos, e você pode matá-los como achar melhor.
Zzz
2
Gostaria de acrescentar que, se você omitir -fe &colocar o processo em segundo plano no final, poderá obter o PID $!como um identificador para eliminar o processo de encapsulamento posteriormente no seu script.
bk138
6

Eu sugeriria simplesmente integrar seus túneis à sua conexão "um para qualquer que seja". Você pode facilitar adicionando as entradas apropriadas ao seu ~/.ssh/configarquivo:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

Você pode simplesmente fazer login executando:

> ssh server2

Os túneis devem surgir e começar a trabalhar, deixando você com uma única instância SSH na qual fazer "qualquer coisa". Se você precisar abrir uma segunda conexão server2, poderá receber um erro:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

Isso não machuca nada além de seus olhos. Você também pode configurar esses encaminhadores para vários servidores adicionando linhas semelhantes para outros servidores, e tudo aconteceria automaticamente.

Jack M.
fonte
A resposta do @ zzz parece fazer a mesma coisa, mais ou menos, e é um pouco mais direta. Obrigado, no entanto.
sprugman
Isso, combinado com as opções -f -N, é uma excelente maneira de configurar o encaminhamento para várias portas de uma só vez. Obrigado cara.
Narsk