В Paramiko успешно выполняется только команда pwd, другие терпят неудачу с «ksh: ...: не может быть выполнена - нет такого файла или каталога» - PullRequest
0 голосов
/ 24 ноября 2018

Успешно удалось создать SSH-соединение между моей машиной Windows и системой QNX (~ linux).

Единственной командой, которая получает какой-либо вывод (stdout), является 'pwd`.

# SSH Connection stuff

stdin, stdout, stderr = client.exec_command('pwd')
output = stdout.readlines()
error = stderr.readlines()
readback = [output, error]

for index, val in enumerate(readback):
    readback = '\n'.join(val)
    print("%s:\t%s") %(index, readback)

Пример вывода команды' pwd ':

0: /home/rxm
1:

Когда я меняю командуот pwd до ls:

0:  
1:  ksh: ls: cannot execute - No such file or directory

Я получаю ту же ошибку при попытке выполнить другие простые команды, например pidin, ifconfig и т. д.

Все необходимые командыработает, когда я использую PuTTY и создаю SSH-соединение.

Кто-нибудь видел такое поведение?Не повезло и по маршруту invoke.shell.Спасибо.

Ответы [ 2 ]

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

Для сеанса Paramiko переменная окружения PATH явно не содержит путей к общим инструментам.

Канал "exec" в Paramiko (по праву) не выделяет псевдотерминал (PTY) длясессия.Как следствие, другой набор сценариев запуска (может быть) получен (в частности, для неинтерактивных сеансов .bash_profile и аналогичные не создаются).И / или разные ветки в скриптах берутся из-за отсутствия / присутствия переменной окружения TERM.Таким образом, среда может отличаться от интерактивного сеанса, который вы используете со своим SSH-клиентом.

Таким образом, в вашем случае PATH, вероятно, установлен по-другому;и, следовательно, исполняемый файл ls не может быть найден.pwd, вероятно, является встроенной командой вашей оболочки, поэтому ей не нужен какой-либо путь.

Чтобы убедиться, что это основная причина, отключите выделение псевдо-терминала в вашем SSH-клиенте.Например, в PuTTY это Соединение> SSH> TTY> Не выделять псевдотерминал .Затем перейдите к Соединение> SSH> Удаленная команда и введите команду ls.Проверьте Сеанс> Закрыть окно при выходе> Никогда и откройте сеанс.Вы должны получить то же самое "ksh: ls: не может быть выполнен - ​​нет такого файла или каталога" ошибка.


Способы исправить это, в порядке предпочтения:

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

  2. Исправьте команду, чтобы она не зависела от конкретной среды,Используйте в команде полный /bin/ls.

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

    bash --login -c "ls"
    
  4. Другой (не рекомендуемый) подход заключается в принудительном выделении псевдотерминала для канала «exec» с помощью аргумента get_pty:

    stdin, stdout, stderr = client.exec_command('ls', get_pty = True)
    

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

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

pwd, вероятно, встроен в вашу оболочку, тогда как все остальные команды, которые вы выполняете, - нет.ls не найден, так как $PATH не задан, поэтому вы можете либо установить переменную окружения PATH, либо использовать полный путь при вызове команд, таких как /bin/ls.

...