2016-07-28 37 views
0

ich den einfachen Python-Skript mit pexpect erstellt, erstellt einem spwan Prozess mitNicht in der Lage Datei mit ssh auf einem anderen Server mit Python pexpect auf Linux finden

CurrentCommand = "ssh " + serverRootUserName + "@" + serverHostName 
child = pexpect.spawn(CurrentCommand) 

Jetzt habe ich einen Befehl wie ls-a leite oder „finden/opt/Lizenz/-name‚* .xml‘“ Code

child.run(mycommand) 

es funktioniert gut von PyCharm wenn läuft, aber wenn vom Terminal läuft es ist es nicht funktioniert ist nicht in der Lage eine beliebige Datei zu finden, Ich denke, dass es in mein lokales System schaut.

Kann mir jemand etwas vorschlagen. Danke

Antwort

0

Als Vorschlag, schauen Sie sich die Paramiko-Bibliothek (oder Fabric, die es verwendet, hat aber einen bestimmten Zweck), da dies eine Python-Schnittstelle zu SSH ist. Es könnte Ihren Code ein wenig besser und widerstandsfähiger gegen Bugs oder Angriffe machen.

Allerdings denke ich, das Problem kommt aus Ihrer Verwendung von run.

Diese Funktion führt den angegebenen Befehl aus; wartet darauf, dass es endet; gibt dann alle Ausgaben als Zeichenfolge zurück. STDERR ist in der Ausgabe enthalten. Wenn der vollständige Pfad zum Befehl nicht angegeben ist, wird der Pfad gesucht.

Was Sie sehen sollten, ist "erwarten". I.e. Ihre Laich mit spawn dann sollten Sie expect warten verwenden für das zu einem sachgemäßen Punkt (wie zu bekommen, wie verbunden, Terminal bereit, nach motd etc geschoben (weil ouy einen Benutzername und Passwort in etc setzen haben könnte.)

Dann Sie wollen sendline ausführen, um eine Linie, um das Programm zu senden Siehe Beispiel:

http://pexpect.readthedocs.io/en/latest/overview.html

Hoffnung, die hilft, und ernsthaft, einen Blick auf paramiko haben;)

+0

ich dies bereits verwendet, aber es ist. nicht funktioniert child.sendline ('mycommand') gefolgt von child.expect ('prompt:') –

+0

Sie sollten * dann * send line erwarten: Im Grunde müssen Sie warten, bis sich der ssh verbindet, bevor Sie versuchen, mehr Daten zu übertragen. Ich bin überrascht, dass die SSH nicht nach einem Benutzernamen und Passwort fragen würde (es sei denn, Sie verwenden SSH-Schlüssel, aber Sie wäre besser, verwenden Sie das Argument -i, um Ihren Schlüssel auf der ursprünglichen SSH-Verbindung zu spezifizieren Der Prozess, den Sie gestartet haben - es ist mehr für die Ausführung von Skripten. – Jmons

+0

Ich habe nicht den vollständigen Code hier geschrieben Ich habe den Befehl child = pexpect.spawn (CurrentCommand) und das Passwort zur Verfügung gestellt, So habe ich jetzt das Kind Objekt, das ist SSH zu einem anderen Server jetzt, wenn ich vom Unix-Terminal child.sendline (find/opt/license/-name '* .xml'), gefolgt von child.expect ('prompt:') läuft es zeigt nicht die Daten, aber läuft von Pycharm funktioniert, Es sieht so aus, als würde es in meinen lokalen Server schauen, von wo aus ich die Python-Skriptdatei ausgeführt habe, zB [email protected] mypyhton.py –