2016-12-11 3 views
0

Я пытаюсь использовать ткань в python для отправки команд в программу на другой машине.Python ssh с тканью, код 127

Этот код работает отлично:

from fabric.api import env, run 

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

run('ls') 

Но при запуске

run('rostopic list') 

Я получаю

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

Однако на самой машине, если я бегу

rostopic list 

он работает, как предполагается

Я не уверен, как действовать, и я не понимаю, почему он не работает с тканью. FYI Я попытался реализовать это с paramiko, но у меня также возникают проблемы, однако он отлично работает с pxssh. Проблема в том, что мне нужно, чтобы это работало на Windows, а pxssh несовместимо. Как я могу заставить эту команду работать с тканью?

+0

Вы уверены, что среда оболочки для SSH сессии правильно? Как вы используете '/ bin/sh' по сравнению с'/bin/bash'? –

+0

Как запустить его в/bin/sh? Я не уверен, как изменить среду оболочки. До сих пор я выполнял эти команды в командной строке python. – frenchie007

+0

Возможно, он уже запущен в '/ bin/sh'. Это моя точка зрения, это то, что 'bash' может иметь другую среду PATH, поэтому позволяет вам выполнять команду –

ответ

0

Из комментариев, которые вы сделали о проблемах Pathing, это звучит, как вам нужно будет использовать некоторую комбинацию path, cd и/или prefix менеджеров контекста для того, чтобы запустить ROS (Robot Operating System) команд через соединение SSH. Вы могли бы также хотели бы устранить, получая ткань полностью из картины, и вместо того, чтобы работать над получением команды работать через ssh -t, например, так:

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

Пример использование менеджеров контекст с тканью будет выглядеть следующим образом:

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

Это довольно надуманное, но, надеюсь, иллюстрирует суть. Несмотря на это, я должен сначала убедиться, что вы можете запустить команду через ssh -t. Решение этой проблемы, скорее всего, приведет вас к правильному пути, чтобы это произошло с Fabric.

Как сторона/связанное с этим соображение: это виртуальная среда на вашей удаленной машине? Вы можете использовать менеджер prefix контекста, чтобы активировать его, например, так:

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

Или с помощью ssh -t, вы можете выполнить:

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

Мне нужно это, чтобы работать в Windows, хотя .. Также я играл с plink.exe, и получается, что команды 'rostopic' работают, когда я запускаю' plink -pw password user @ xxx.xxx.xxx.xxx' для использования интерактивной оболочки. Однако, если я отправляю команды напрямую с помощью 'plink -pw password [email protected] rostopic list', я имею ту же ошибку с' bash: rostopic: command not found' – frenchie007