Python-pexpect - TIMEOUT fällt in die traceback-und Ausgänge
Ich bin neu in der python-pexpect. In Tcl/erwarten, wenn ich traf einen timeout - ich würde Antworten, mit der Meldung und beenden Sie die Funktion. Ich habe versucht, zu Experimentieren mit ähnlichen Antwort mit Beispiel-code geschrieben
http://pexpect.svn.sourceforge.net/viewvc/pexpect/trunk/pexpect/examples/sshls.py?revision=489&view=markup
Ich basierend auf diesem code oben - wenn ich ein falsche Passwort, ich würde erwarten, dass dies nur timeout, print "FEHLER!", und Programm beenden. Aber wenn ich es laufen - geht in einen 'Traceback-Ausgabe (siehe unten), kann mir jemand helfen um das Programm zu drucken, "FEHLERMELDUNG" und das Programm beenden würde.
test@ubuntu:~/scripts$ ./tmout.py
Hostname: 192.168.26.84
User: root
Password:
Timeout exceeded in read_nonblocking().
<pexpect.spawn object at 0xb77309cc>
version: 2.3 ($Revision: 399 $)
command: /usr/bin/ssh
args: ['/usr/bin/ssh', '-l', 'root', '192.168.26.84', '/bin/ls', '-l']
searcher: searcher_re:
0: EOF
buffer (last 100 chars):
Permission denied, please try again.
root@192.168.26.84's password:
before (last 100 chars):
Permission denied, please try again.
[email protected]'s password:
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 14997
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
Traceback (most recent call last):
File "./tmout.py", line 54, in <module>
traceback.print_exc()
NameError: name 'traceback' is not defined
test@ubuntu:~/scripts$
Source Code:
#!/usr/bin/env python
"""This runs 'ls -l' on a remote host using SSH. At the prompts enter hostname,
user, and password.
$Id$
"""
import pexpect
import getpass, os
def ssh_command (user, host, password, command):
"""This runs a command on the remote host. This could also be done with the
pxssh class, but this demonstrates what that class does at a simpler level.
This returns a pexpect.spawn object. This handles the case when you try to
connect to a new host and ssh asks you if you want to accept the public key
fingerprint and continue connecting. """
ssh_newkey = 'Are you sure you want to continue connecting'
child = pexpect.spawn('ssh -l %s %s %s'%(user, host, command))
i = child.expect([pexpect.TIMEOUT, ssh_newkey, 'password: '])
if i == 0: # Timeout
print 'ERROR!'
print 'SSH could not login. Here is what SSH said:'
print child.before, child.after
return None
if i == 1: # SSH does not have the public key. Just accept it.
child.sendline ('yes')
child.expect ('password: ')
i = child.expect([pexpect.TIMEOUT, 'password: '])
if i == 0: # Timeout
print 'ERROR!'
print 'SSH could not login. Here is what SSH said:'
print child.before, child.after
return None
child.sendline(password)
return child
def main ():
host = raw_input('Hostname: ')
user = raw_input('User: ')
password = getpass.getpass('Password: ')
child = ssh_command (user, host, password, '/bin/ls -l')
child.expect(pexpect.EOF)
print child.before
if __name__ == '__main__':
try:
main()
except Exception, e:
print str(e)
traceback.print_exc()
os._exit(1)
InformationsquelleAutor Tester315 | 2012-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
First off, Sie sollte den import traceback, so kommt es zu einem unerwarteten Fehler in das Programm
traceback.print_exc()
arbeiten.Ich habe auch ein
die()
- Funktion, so dass ssh geschlossen wird, wenn das Programm beendet wird.Löschen Sie diese Zeile, da war es wohl dort Links durch Fehler nach dem hinzufügen der korrekte Befehl in der nächsten Zeile:
Die richtige Zeile (die Griffe timeouts) ist:
dann ersetzen Sie diese:
mit dabei:
Diese änderung wird Ihnen sagen, erkennt das Programm ein Falsches Passwort oder timeout anmutig, wenn es unbekannte Eingabe, anstatt eine Ausnahme. Beachten Sie, dass wenn Ihr den Befehl ausgeführt, länger als die Standard-timeout-Dauer, es wird abgebrochen, bevor er abgeschlossen ist. Sie müssen so etwas wie
timeout=60
als argument zuexpect()
um das zu ändern.Auch, Rückkehr
None
nach einem timeout ist das nicht sinnvoll. Stattdessen rufendie()
aufgerufenexit(1)
:Dies ist der Letzte code:
InformationsquelleAutor sudoman
Ich würde empfehlen, Sie versuchen, die pxssh Modul/Klasse, der kommt mit pexpect zu automatisieren ssh-Sitzungen.
Dies würde reduzieren auf Ihren code durch den Umgang mit diesen alltäglichen Situationen.
Hier finden Sie einige Beispiel-code kopiert aus einem anderen StackOverflow https://stackoverflow.com/a/6189676/570450
InformationsquelleAutor Lars Nordin