ssh trava quando comando chamado diretamente, mas sai limpa quando executado interativo

votos
1

Eu preciso lançar um servidor na máquina remota e recupere o número da porta que o processo servidor é lsitening diante. Quando chamado, o servidor irá escutar uma porta aleatória e de saída o número da porta em stderr.

Eu quero automatizar o processo de logon na máquina remota, iniciar o processo, e recuperar o número da porta. Eu escrevi um script Python chamado invokejob.py que vive na máquina remota para agir como um wrapper que chama o trabalho e, em seguida, retorna o número da porta, parece que esta:

import re, subprocess
executable = ... # Name of executable
regex = ... # Regex to extract the port number from the output
p = subprocess.Popen(executable,
    bufsize=1, # line buffered
    stderr=subprocess.PIPE
    )
s = p.stderr.readline()
port = re.match(regex).groups()[0]
print port

Se eu fizer logon interativamente, este script funciona:

$ ssh remotehost.example.com
Last login: Thu Aug 28 17:31:18 2008 from localhost
$ ./invokejob.py
63409
$ exit
logout
Connection to remotehost.example.com closed.

(Nota: o logout bem sucedido, ele não reagir).

No entanto, se eu tentar invocá-lo a partir da linha de comando, ele simplesmente trava:

$ ssh remotehost.example.com invokejob.py

Alguém sabe por que ele trava no segundo caso, eo que posso fazer para evitar isso?

Note que eu preciso para recuperar a saída do programa, então eu não pode apenas usar o ssh -f bandeira ou redirecionar a saída padrão.

Publicado 28/08/2008 em 22:48
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

s = p.stderr.readline()

Eu suspeito que é a linha acima. Quando você invocar um comando diretamente através ssh, você não receber o seu Pty completo (assumindo Linux), e, portanto, não stderr para ler.

Quando você faz logon interativamente, stdin, stdout e stderr são configurados para você, e para que o seu script funciona.

Respondeu 28/08/2008 em 22:53
fonte usuário

votos
0

@ Ben Collins

Eu acho que você está certo sobre stderr sendo um problema. Tenho a certeza que ela está bloqueando na chamada readline ().

No final, eu desisti e decidiu usar o módulo pxssh de pexpect para automatizar minha interação com uma sessão de ssh.

H @Misha

Infelizmente, o truque ponto e vírgula não funciona aqui: ele bloqueia na execução de meu programa.

Respondeu 29/08/2008 em 03:42
fonte usuário

votos
0

e se você faça o seguinte:

ssh <remote host> '<your command> ;<your regexp using awk or something>'

Por exemplo

ssh <remote host> '<your program>; ps aux | awk \'/root/ {print $2}\''

Isso irá conectar, executar e, em seguida, imprimir cada PSID para qualquer usuário root ou qualquer processo com raiz em sua descrição.

Eu tenho usado este método para a execução de todos os tipos de comandos em máquinas remotas. O problema é para embrulhar o comando (s) que pretende executar entre aspas simples ( ') e para separar cada comando com um ponto e vírgula (;).

Respondeu 29/08/2008 em 00:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more