Eu tenho o seguinte problema:
Eu tenho uma máquina remota acessível via ssh que pode servir alguns dados através de uma interface web.
Eu posso usar o OpenSSH LocalForwarding para abrir um túnel e iniciar o servidor remoto:
ssh [email protected] -L 127.0.0.1:3333:localhost:4000 ./start.sh
então, em outro terminal (ou da GUI), posso iniciar um navegador, por exemplo:
firefox localhost:3333/whatever
e acessar o conteúdo servido pelo meu aplicativo.
Após o uso eu simplesmente dou [CTRL-C] para start.sh
fechar servidor, conexão e túnel.
Até agora tudo bem.
A pergunta é: É possível escrever um script combinando tudo de tal forma que o túnel seja fechado quando o navegador terminar?
Para ser mais preciso, gostaria de um script que:
- Abre o túnel e inicia o servidor remoto (como acima).
- Abre automaticamente um navegador (o Firefox está ok, mas não é obrigatório) na porta certa (que pode ser gerada aleatoriamente).
- Mantém o túnel ativo enquanto o navegador está em execução.
- Quando o navegador termina (estou ciente de que pode haver outras janelas abertas, mas isso está além do ponto) ele deve enviar um sinal (
SIGHUP
) para o servidor (start.sh
). - Quando o servidor remoto termina o túnel deve ser fechado (isso deve ser automático com a configuração acima)
Gostaria de manter o túnel e o servidor funcionando pelo tempo estritamente necessário, evitando "esquecer o fechamento", pois pode acontecer se eu tiver que fazer manualmente.
Como posso fazer isso?
Parece que você já descreveu a maioria das etapas da sua pergunta. Isso é praticamente o que você está pedindo:
./start.sh
Se o comando remoto terminar, entãossh
sairá. Este script não cuida de sair do firefox nesse caso, mas o túnel não existirá mais.Acontece que a resposta é um pouco mais complicada do que o esperado.
Acabei escrevendo um script de inicialização completo para o servidor:
Então eu chamo com o seguinte script:
Se @larsks ou qualquer outra pessoa tiver uma resposta melhor, aceitarei a resposta com prazer, caso contrário, aceitarei a minha em alguns dias.
Eu votei em @larsks porque despertou a ideia.