выполнить какую команду над ssh в скрипте Python - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь запустить команду which solsql через SSH в скрипте Python.

Я думаю, что проблема в команде ssh, а не в части Python, но, возможно, это и то и другое.

Я пытался

subprocess.check_output("ssh root@IP which solsql",
    stderr=subprocess.STDOUT, shell=True)

но я получаю ошибку.

Я пытался запустить команду вручную:

ssh root@{server_IP}" which solsql"

и я получаю другой вывод.

На сервере я получаю реальный путь (/opt/solidDB/soliddb-6.5/bin/solsql) но по SSH я получаю это:

which: no solsql in
(/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Во-первых, вам нужно отладить вашу ошибку.

Используйте код, подобный следующему:

command = "ssh root@IP which solsql"

try:
    retult = subprocess.check_output(command,shell=True,stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))

print ("Result:", result)

Он выведет вам сообщение об ошибке, и вы будете знать, что делать, например, ssh мог запросить пароль, или не нашел ваш ключ, или что-то еще.

0 голосов
/ 08 ноября 2018

Когда вы запускаете команду через 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' в подпроцессе

0 голосов
/ 08 ноября 2018

Я думаю, что вы ищете что-то вроде paramiko . Пример использования библиотеки и выдачи команды удаленной системе.

import base64
import paramiko
key = paramiko.RSAKey(data=base64.b64decode(b'AAA...'))
client = paramiko.SSHClient()
client.get_host_keys().add('ssh.example.com', 'ssh-rsa', key)
client.connect('ssh.example.com', username='THE_USER', password='THE_PASSWORD')
stdin, stdout, stderr = client.exec_command('which solsql')
for line in stdout:
    print('... ' + line.strip('\n'))
client.close()
...