Como iniciar dois processos suportados por piggie? Então o primeiro termina quando o segundo terminar?

3

Estou executando um script com comandos ssh para um servidor atrás de um host de salto. Cada vez que eu quero executar um comando no meu servidor na rede segura, eu preciso ssh no servidor de salto (bastião) e executar nc e, em seguida, ssh com o comando real que eu quero executar através do canal netcat . Então eu preciso parar o original nc .

Eu gostaria de um 'e comercial inteligente' que me permita executar os dois processos ao mesmo tempo e, em seguida, encerre o processo nc ssh quando meu processo com backup for concluído.

Aqui está o que estou fazendo atualmente.

ssh -g -L 23:localhost:22 -f -N user@jumphost &
ssh user2@localhost -P 23 "ssh user@destination server \"ls -al\""
kill -0 $!

O problema com isso é que não é atômico. Se houver um erro no script, ele não será concluído e eu não terminarei com o processo nc original no final.

Minha pergunta é: Como iniciar dois processos baseados em piggie? Então o primeiro termina quando o segundo termina?

    
por hawkeye 06.08.2015 / 13:51

3 respostas

1

Isso não está respondendo a sua pergunta, mas essa resposta em SU é resolvendo seu problema, eu acho:

Usar ProxyCommand no seu ~/.ssh/config deve fazer tudo por você:

Host server
  HostName server.tld
  User {server user}
Host proxy
  ProxyCommand ssh server -W %h:%p
  User {proxy user}

Então você pode acessar seu servidor simplesmente usando ssh server

    
por 06.08.2015 / 14:08
0

Se eu interpretar seu comando corretamente, não seria o mesmo que isso?

ssh -t user@jumphost ssh user@destination ...

Tudo o que o -L parece estar fazendo é um encaminhamento para o servidor SSH do jumphost - mas você já está se conectando a isso, então por que o túnel adicional?

Neste cenário, o jumphost também seria o cliente SSH para a segunda conexão. Se você não puder confiar que o host de salto seja o cliente (ou seja, se quiser que o host de salto veja apenas dados criptografados), você precisará -L 23:destination:22 em vez de localhost , não?

    
por 06.08.2015 / 14:07
0

Uma solução alternativa usando wait :

Com wait , você poderia usar um PID para aguardar: wait $PID , mas usaremos simplesmente o argumento para executar nosso segundo comando. Note que todas as saídas devem ser ignoradas por não serem passadas como argumento para o comando wait (deixando-nos assim com um uso indevido de wait como em command & wait )

process1 & wait $( process2 &> /dev/null )

logicamente process1 terá que esperar que process2 termine pois wait está aguardando que process2 termine para obter a variável interpretada.

EDITAR: Isso também pode ser aninhado:

sleep 1 & wait $( sleep 2 & wait $( sleep 3 & wait $( sleep 4 ) ) )

sleep por 4 segundos.

    
por 07.08.2015 / 15:16