ssh κρέμεται όταν η εντολή που επικαλείται άμεσα, αλλά βγαίνει καθαρά όταν τρέχει διαδραστικά

ψήφοι
1

Θα πρέπει να ξεκινήσει ένα διακομιστή στον απομακρυσμένο υπολογιστή και να ανακτήσετε τον αριθμό θύρας που η διαδικασία διακομιστή lsitening καθεξής. Όταν η κλήση, ο διακομιστής θα ακούσετε σε μια τυχαία θύρα και εξόδου τον αριθμό θύρας για stderr.

Θέλω να αυτοματοποιήσει τη διαδικασία της σύνδεση με το απομακρυσμένο μηχάνημα, την έναρξη της διαδικασίας, και την ανάκτηση του αριθμού θύρας. Έγραψα ένα σενάριο Python που ονομάζεται « invokejob.py» που ζει στο απομακρυσμένο μηχάνημα να ενεργεί ως περιτύλιγμα που επικαλείται τη δουλειά και στη συνέχεια επιστρέφει τον αριθμό θύρας, που μοιάζει με αυτό:

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

Αν μπορώ να συνδεθώ με διαδραστικό τρόπο, αυτό το σενάριο λειτουργεί:

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

(Σημείωση: επιτυχή αποσύνδεση, δεν κολλάει).

Ωστόσο, αν προσπαθώ να το επικαλούνται από τη γραμμή εντολών, απλά κρέμεται:

$ ssh remotehost.example.com invokejob.py

Ξέρει κανείς γιατί κρέμεται στη δεύτερη περίπτωση, και τι μπορώ να κάνω για να αποφευχθεί αυτό;

Σημειώστε ότι θα πρέπει να ανακτήσετε την έξοδο του προγράμματος, οπότε δεν μπορώ απλά χρησιμοποιήστε το ssh «-f» σημαία ή ανακατεύθυνση κανονική έξοδο.

Δημοσιεύθηκε 28/08/2008 στις 22:48
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
3

s = p.stderr.readline()

Υποψιάζομαι ότι είναι η παραπάνω γραμμή. Όταν επικαλούνται μια εντολή απευθείας μέσω ssh, δεν έχετε πλήρη PTY σας (υποθέτοντας ότι το Linux), και ως εκ τούτου δεν stderr να διαβάσει από το.

Όταν συνδέεστε με διαδραστικό τρόπο, stdin, stdout και stderr έχουν δημιουργηθεί για σας, και έτσι το σενάριο σας λειτουργεί.

Απαντήθηκε 28/08/2008 στις 22:53
πηγή χρήστη

ψήφοι
0

Τι κι αν κάνετε τα εξής:

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

Για παράδειγμα

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

Αυτό θα συνδεθεί με, την εκτέλεση και, στη συνέχεια, εκτυπώστε κάθε PSID για οποιονδήποτε root χρήστη ή οποιαδήποτε διεργασία με ρίζα στην περιγραφή του.

Έχω χρησιμοποιήσει αυτή τη μέθοδο για τη λειτουργία όλων των ειδών τις εντολές σε απομακρυσμένα μηχανήματα. Η σύλληψη είναι να τυλίξετε την εντολή (ες) που θέλετε να εκτελέσετε σε μονά εισαγωγικά ( ') και να διαχωρίζει κάθε εντολή με ένα ερωτηματικό (?).

Απαντήθηκε 29/08/2008 στις 00:50
πηγή χρήστη

ψήφοι
0

@Ben Collins

Νομίζω ότι έχεις δίκιο για το stderr είναι ένα ζήτημα. Είμαι αρκετά σίγουρος ότι είναι το κλείδωμα για την πρόσκληση readline ().

Στο τέλος, παράτησα και αποφάσισε να χρησιμοποιήσει τη μονάδα pxssh από pexpect για την αυτοματοποίηση της αλληλεπίδρασης μου με μια συνεδρία SSH.

@Misha M

Δυστυχώς, το τέχνασμα άνω τελεία δεν λειτουργεί εδώ: το μπλοκ για την εκτέλεση του προγράμματος μου.

Απαντήθηκε 29/08/2008 στις 03:42
πηγή χρήστη

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