Некоторые команды Unix терпят неудачу с «<command> not found», когда выполняются с использованием Python Paramiko exec_command - PullRequest
2 голосов
/ 29 марта 2019

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

sh: sesu: not found

Когда я запускаю простую команду 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)

1 Ответ

6 голосов
/ 29 марта 2019

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

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

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

    /bin/sesu test
    

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

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

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

    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 с помощью библиотеки Python Paramiko и извлекать выходные данные из CLI удаленного компьютера?


См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...