como executar um túnel em segundo plano como parte de um script de shell

1

Eu executo esses dois comandos o tempo para se conectar à minha instância rds em aws que está protegido por trás de um firewall (então eu túnel através da instância ec2) assim:

comando 1: abra o túnel (executado em segundo plano)

ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &

comando 2: conecte-se ao db pela porta do túnel:

PGPASSWORD=password psql dbname -U user -h ip_address -p port;

que é incrível, mas eu gostaria de colocar ambos em uma única função. Mas nada funcionou comigo:

tentativa 1: executar sem material de plano de fundo:

function db()
{
    ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &
    PGPASSWORD=password psql dbname -U user -h ip_address -p port;
}

simplesmente me diz isso:

$proddb
[1] 62924
psql: could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 6666?

embora o comando inicial esteja sendo executado em segundo plano:

ps aux | grep host
(standard input):435:abdullah         62924   0.0  0.0  4315660   5828 s006  S     3:06PM   0:00.03 ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub

e se eu imediatamente executar o próximo comando depois dele .. eu conecto-me ao banco de dados muito bem!

PGPASSWORD=password psql dbname -U user -h ip_address -p port;
user=>

como faço isso funcionar?

    
por abbood 13.04.2018 / 14:13

1 resposta

2

O primeiro comando não teve tempo de estabelecer um túnel quando o segundo comando foi executado, dando assim uma "Conexão recusada".

Apenas não use & , mas use a opção -f :

-f
Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background. This implies -n. The recommended way to start X11 programs at a remote site is with something like ssh -f host xterm.
If the ExitOnForwardFailure configuration option is set to “yes”, then a client started with -f will wait for all remote port forwards to be successfully established before placing itself in the background.

Colocando tudo isso junto, substitua a linha ssh na função por:

ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub

assim, rodando a função várias vezes, não vai deixar (multi-1) ssh inútil rodando.

Também é possível substituir -N por um comando sleep curto e remoto. Dessa forma, não haverá um comando idle ssh ocioso que deve ser pesquisado se tiver que ser morto. O Ssh ainda esperará o fim do uso do túnel antes de terminar, então o pequeno atraso não é um problema:

ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15
    
por 14.04.2018 / 13:06