Когда вы запускаете команду через SSH, ваша оболочка выполняет другой набор файлов запуска, чем при интерактивном подключении к серверу. Таким образом, фундаментальная проблема заключается в том, что путь, на котором установлен этот инструмент, отсутствует в вашем PATH
при подключении через ssh
из сценария.
Обычный, но грубый обходной путь - заставить оболочку читать файл с нужным вам определением PATH
; но, конечно, это в основном требует, чтобы вы знали, по крайней мере, где установлен правильный PATH
, так что вы могли бы просто выяснить, где именно инструмент установлен в любом случае.
ssh server '. .bashrc; type -all solsql'
(при условии, что PATH
настроен в вашем .bashrc
; и игнорирование на данный момент разницы между выполнением вещи как вы сами и как root
. Точка и пробел перед .bashrc
весьма значимы. Обратите также внимание на то, как мы используем команду POSIX type
вместо хрупкой which
, которая должна была умереть естественной, но ужасной смертью десятилетия назад).
Если у вас есть хорошее представление о том, где может быть установлен инструмент, возможно, вместо этого сделайте
subprocess.check_output(['ssh', 'root@' + ip, '''
for path in /opt/solidDB/*/bin /usr/local/bin /usr/bin; do
test -x "$path/solsql" || continue
echo "$path"
exit 0
done
exit 1'''])
Обратите внимание, как мы также избегаем (здесь бесполезно) shell=True
. Возможно, смотрите также Фактическое значение 'shell = True' в подпроцессе