Некоторые команды Unix завершаются с ошибкой «<команда> не найдена» при выполнении с использованием Python Paramiko exec_command



shell ssh (1)

Я пытаюсь запустить команду sesu на сервере Unix из Python с помощью Paramiko exec_command . Однако, когда я запускаю эту команду exec_command('sesu test') , я получаю

sh: sesu: не найден

Когда я запускаю простую команду ls она дает желаемый результат. Только с командой sesu это не работает нормально.

Вот как выглядит мой код:

import paramiko

host = host
username = username
password = password
port = port

ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)
stdin,stdout,stderr=ssh.exec_command('sesu test')
stdin.write('Password')
stdin.flush()
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)

Команда SSHClient.exec_command по умолчанию не запускает оболочку в режиме «входа в систему» ​​и не выделяет псевдотерминал для сеанса. Как следствие, другой набор сценариев запуска (может быть) получен (особенно для неинтерактивных сеансов, не получен .bash_profile ), чем в вашем обычном интерактивном сеансе SSH. И / или разные ветки в скриптах взяты, исходя из отсутствия / присутствия переменной окружения TERM .

Возможные решения (в порядке предпочтения):

  1. Исправьте команду не полагаться на конкретную среду. Используйте полный путь к sesu в команде. Например:

    /bin/sesu test

    Если вы не знаете полного пути, в распространенных системах * nix вы можете использовать команду which sesu в интерактивном сеансе SSH.

  2. Исправьте ваши сценарии запуска, чтобы установить одинаковые значения PATH как для интерактивных, так и для неинтерактивных сеансов.

  3. Попробуйте запустить скрипт явно через оболочку входа в систему (используйте переключатель --login с обычными * nix оболочками):

    bash --login -c "sesu test"
  4. Если сама команда зависит от конкретной настройки среды и вы не можете исправить сценарии запуска, вы можете изменить среду в самой команде. Синтаксис для этого зависит от удаленной системы и / или оболочки. В обычных * nix системах это работает:

    PATH="$PATH;/path/to/sesu" && sesu test
  5. Другой (не рекомендуемый) подход заключается в принудительном выделении псевдо-терминала для канала "exec" с использованием метода .setPty :

    stdin,stdout,stderr=ssh.exec_command('sesu test', get_pty=True)

    Использование псевдотерминала для автоматизации выполнения команд может привести к неприятным побочным эффектам. Посмотрите, например, есть ли простой способ избавиться от ненужных значений, которые появляются, когда вы используете SSH с помощью библиотеки Paramiko Python и извлекаете выходные данные из CLI удаленной машины?

Смотрите также:

  • Различия переменных среды при использовании Paramiko
  • Некоторые команды Unix терпят неудачу с "... not found", когда выполняются через Java с использованием JSch




paramiko