2012-06-22 10 views
5

Ich versuche zu laufen erwarten, dass mein Python zu instruieren Skript „myexpect.sh“ auszuführen erwarten:einfachste Weg Skript von Python

#!/usr/bin/expect 
spawn ssh [email protected] 
expect "password:" 
send "mypassword\n"; 
send "./mycommand1\r" 
send "./mycommand2\r" 
interact 

Ich bin auf dem Fenster, so dass wieder das Schreiben die Zeilen in der erwartet Skript in Python sind keine Option. Irgendwelche Vorschläge? Gibt es etwas, das es so ausführen kann "./myexpect.sh" tut es aus einer Bash-Shell? Danke für jede Hilfe.


edit: Ich habe einige Erfolge mit dem Befehl subprocess hatte

subprocess.call("myexpect.sh", shell=True) 

erhalte ich die Fehlermeldung: 'myexpect.sh ist keine gültige Win32-Anwendung' Irgendwelche Vorschläge, wie man das umgehen kann?

+0

... fragen Sie, wie ohne bash ein Bash-Skript unter Windows laufen zu lassen? Ich sehe nicht einmal, wo Python hier reinkommt. Außerdem sollten Sie Ihren Shell-Skripten wahrscheinlich .txt-Erweiterungen geben (.sh, wenn überhaupt) –

+0

@MateuszKowalczyk in gewissem Sinne ja: Ich möchte dieses Skript automatisch aus einer .py-Datei ausführen - wenn ich die .py-Datei ausführe, Das Expect-Skript wird aufgerufen und als Teil der Sequenz der .py-Datei ausgeführt. – gortron

+0

Es sieht also so aus, als ob Sie überhaupt keine Python-bezogene Lösung suchen (abgesehen von der Tatsache, dass es von Python aus gesteuert wird). Sie wollen einfach ein Programm unter Windows, das das expect-Skript lesen und ausführen kann, oder? –

Antwort

13

Verwenden Sie pexpect library. Dies ist eine Python-Version für die expect-Funktionalität.

Beispiel:

child = pexpect.spawn('some command that requires password') 
child.expect('Enter password:') 
child.sendline('password') 
child.expect(pexpect.EOF, timeout=None) 
cmd_show_data = child.before 
cmd_output = cmd_show_data.split('\r\n') 
for data in cmd_output: 
    print data 

Pexpect kommt mit vielen Beispielen zu lernen. Für die Verwendung von interact() Besuche script.py von Beispielen

[Edit: Für Fenster gibt es eine Alternative zu pexpect]

+0

pexpect ist eine brillante Lösung, wenn Sie auf einer Linux-Plattform arbeiten, aber es gibt keine pexpect-Bibliothek für Windows-Plattformen. – gortron

+0

@gortron: Es gab eine SO Diskussion über Pexpect Äquivalent für Windows. Ich habe das zur Antwort hinzugefügt. Sehen Sie, ob das hilft. – pyfunc

+0

Für die Nachwelt: winpexpect ist eine saubere Lösung. – gortron

0

Da es sich um ein .expect-Skript handelt, sollten Sie den erweiterten Namen Ihres Skripts ändern. Statt

subprocess.call("myexpect.sh", shell=True) 

verwenden, sollten Sie verwenden

subprocess.call("myexpect.expect", shell=True) 
Verwandte Themen