ssh henger når kommandoen startes direkte, men kommer ut ren når det kjøres interaktivt

stemmer
1

Jeg trenger å starte en server på den eksterne maskinen og hente portnummeret som serveren prosessen er lsitening på. Når det blir kjørt, vil serveren lytte på en tilfeldig port og utgang portnummeret på stderr.

Jeg ønsker å automatisere prosessen med å logge seg på den eksterne maskinen, lanserer prosessen, og hente portnummeret. Jeg skrev et Python-skript som heter invokejob.py som lever på den eksterne maskinen til å fungere som en wrapper som påkaller jobb og deretter returnerer portnummeret, det ser slik ut:

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

Hvis jeg logger på interaktivt, dette skriptet fungerer:

$ 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.

(Merk: vellykket utlogging, det gjorde ikke henge).

Men hvis jeg prøver å starte den fra kommandolinjen, det bare henger:

$ ssh remotehost.example.com invokejob.py

Er det noen som vet hvorfor det henger i det andre tilfellet, og hva jeg kan gjøre for å unngå dette?

Legg merke til at jeg trenger å hente utgangen av programmet, så jeg kan ikke bare bruke ssh -f flagg eller omdirigere standard utgang.

Publisert på 28/08/2008 klokken 21:48
kilden bruker
På andre språk...                            


3 svar

stemmer
3

s = p.stderr.readline()

Jeg mistenker at det er over linjen. Når du starter en kommando direkte via ssh, får du ikke full Pty (forutsatt Linux), og dermed ingen stderr å lese fra.

Når du logger deg på interaktivt, stdin, er stdout og stderr satt opp for deg, og så skriptet fungerer.

Svarte 28/08/2008 kl. 21:53
kilden bruker

stemmer
0

@Ben Collins

Jeg tror du har rett om stderr å være et problem. Jeg er ganske sikker på at det blokkerer på readline () samtale.

Til slutt ga jeg opp og bestemte seg for å bruke pxssh modulen fra pexpect å automatisere min interaksjon med en ssh-økt.

@Misha M

Dessverre gjør semikolon trikset fungerer ikke her: den blokkerer på å gjennomføre programmet mitt.

Svarte 29/08/2008 kl. 02:42
kilden bruker

stemmer
0

hva om du gjør følgende:

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

For eksempel

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

Dette kobler til, utføre og deretter skrive ut hvert PSID for enhver bruker rot eller en hvilken som helst prosess med rot i beskrivelsen.

Jeg har brukt denne metoden for å kjøre alle typer kommandoer på eksterne maskiner. Fangsten er å vikle kommandoen (e) man ønsker å utføre i enkle anførselstegn ( ') og for å skille hver kommando med et semikolon (;).

Svarte 28/08/2008 kl. 23:50
kilden bruker

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