2016-12-11 5 views
0

Ich versuche, Fabric in Python verwenden, um Befehle an ein Programm auf einem anderen Computer zu senden.Python ssh mit Stoff, Code 127

Dieser Code funktioniert:

from fabric.api import env, run 

env.host_string = 'xxx.xxx.xxx.xxx' 
env.user = 'username' 
env.password = 'password' 

run('ls') 

Aber wenn

run('rostopic list') 

läuft ich

Warning: run() received nonzero return code 127 while executing 'rostopic list'! 
'/bin/bash: rostopic: command not found' 

jedoch auf der Maschine bekommen selbst wenn ich laufen

rostopic list 

es läuft wie es soll

Ich bin mir nicht sicher, wie es weitergeht und ich verstehe nicht, warum es nicht mit Stoff funktioniert. FYI Ich habe versucht, dies mit paramiko zu implementieren, aber ich habe auch Probleme, aber es funktioniert gut mit pxssh. Das Problem ist, dass ich das unter Windows brauche und pxssh nicht kompatibel ist. Wie kann ich diesen Befehl mit Fabric arbeiten lassen?

+0

Sind Sie sicher, dass die Shell-Umgebung für die SSH-Sitzung ist richtig? Wie läuft '/ bin/sh' im Vergleich zu'/bin/bash'? –

+0

Wie führe ich es in/bin/sh? Ich bin mir nicht sicher, wie ich die Shell-Umgebung ändern soll. Bis jetzt habe ich diese Befehle in der Python-Befehlszeile ausgeführt – frenchie007

+0

Es kann bereits in '/ bin/sh' ausgeführt werden. Das ist mein Punkt, ist, dass 'bash' könnte andere PATH-Umgebung haben, so dass Sie den Befehl ausführen –

Antwort

0

Aus den Kommentaren Sie über die Wegfindung Probleme gemacht haben, es klingt wie Sie eine Kombination der um path, cd und/oder prefix Kontext-Manager müssen verwenden ROS (Robot Operating System) Befehle über eine SSH-Verbindung zu laufen. Vielleicht mögen Sie auch, indem man Gewebe vollständig aus dem Bild beheben, und arbeitet stattdessen den Befehl bekommen, wie so über ssh -t, arbeiten:

$ ssh [email protected] -t "cd /my/home/directory && /opt/ros/indigo/bin/rostopic list" 

Ein Beispiel mit Stoffe mit Kontext-Manager würde wie folgt aussehen:

with path('/opt/ros/indigo/bin/'): 
    with prefix('always run this command'): 
     with cd('/my/special/directory'): 
      run('rostopic list') 

Das ist ziemlich erfunden, aber hoffentlich veranschaulicht den Punkt. Unabhängig davon würde ich zuerst sicherstellen, dass Sie den Befehl über ssh -t ausführen können. Die Lösung dieses Problems wird Sie wahrscheinlich dazu bringen, dies mit Fabric zu erreichen.

Als eine Seite/verwandte Betrachtung: Ist das eine virtuelle Umgebung auf Ihrem Remote-Rechner? Sie könnten den prefix Kontext-Manager verwenden, um es zu aktivieren, etwa so:

with prefix('/opt/ros/indigo/bin/activate'): 
    run('rostopic list') 

Oder mit ssh -t, Sie ausführen können:

$ ssh [email protected] -t "/opt/ros/indigo/bin/activate && rostopic list" 
+0

Ich brauche das, um in Windows zu arbeiten. Ich habe auch mit plink.exe herumgespielt und es stellt sich heraus, dass 'rostopic' Befehle funktionieren, wenn ich' plink -pw password user @ xxx.xxx.xxx.xxx' benutze eine interaktive Shell verwenden. Wenn ich jedoch die Befehle direkt mit 'plink -pw password [email protected] rostopic list' sende, habe ich den gleichen Fehler mit' bash: rostopic: command not found' – frenchie007