Aguarde até que o SSH consiga criar um encaminhamento de porta

7

Estou chamando o ssh (OpenSSH) de um aplicativo OSX / Linux-C ++ via fork / exec para criar um encaminhamento de porta dinâmico. Isso é feito usando o modo de lote (-o BatchMode = yes) e uma chave privada que é fornecida para a opção ssh (-i). A chamada SSH em si não abre um shell (opção -N).

Esta é minha chamada SSH completa:

ssh -N -D 9000 -o BatchMode=yes -i /path/to/private-key user@host

Eu gostaria de continuar com o meu aplicativo o mais rápido possível e, portanto, tenho que descobrir se o ssh foi bem-sucedido ao criar o canal. O próprio SSH só retorna se tiver algum problema.

Existe alguma possibilidade de detectar um encaminhamento de porta bem-sucedido?

É claro que posso esperar até que a porta seja aberta pelo SSH, mas estou procurando uma solução mais elegante. Outra solução é inspecionar o Log (-v) do SSH esperando por "Inserindo Sessão Interativa", mas isso não parece muito portátil para mim.

    
por nob 02.05.2013 / 14:15

2 respostas

4

Use a opção -f e ssh entrará em segundo plano (ou seja, fork e sairá no processo pai), para que você possa apenas waitpid para que o% originalssh seja concluído e você sabe (com base no status de saída) ou que a conexão falhou ou o encaminhamento de porta já está configurado.

    
por 02.05.2013 / 15:02
1

Acho que encontrei outra solução (também hackeada). Ao iniciar o SSH com

ssh -S /some/domain/socket -M ...args... host

ele criará o soquete do domínio de controle apenas para estabelecer a conexão com sucesso. Então eu teria que esperar o socket do domínio aparecer no sistema de arquivos. Ainda não é bonito, mas isso soa mais robusto do que esperar que um soquete de rede apareça.

Curiosamente, isso também pode ser usado para descobrir o PID do mestre (veja Resposta do R). Usando

$ ssh -S /some/domain/socket -O check host
Master running (pid=25503)
    
por 02.05.2013 / 17:39

Tags