В чем разница между exec_command и send с invoke_shell () в Paramiko? - PullRequest
1 голос
/ 19 апреля 2019

Так в чем же разница между SSHClient.exec_command() и отправкой с SSHClient.invoke_shell на Paramiko?

Я могу отправить и выполнить команду с exec_command на маршрутизатор MikroTik, но не могу выполнить ее с send (invoke_shell()).

С другой стороны, я могу отправить и выполнить команду send (invoke_shell()) на устройство Cisco, но не могу выполнить ее с exec_command.

Я имею в виду команду конфигурации, такую ​​как маршрутизация (ip route xxx xxx) или make vlan или добавление ip-адреса и т. Д.

1 Ответ

1 голос
/ 23 апреля 2019

Разница в том, что invoke_shell использует канал SSH shell, а exec_command использует канал SSH exec.

То, что это действительно означает для вас как для пользователя / разработчика, зависит от SSH-сервера, а не от самого Paramiko.


В общем * nix OpenSSH сервер:

  • Канал shell выполняет оболочку входа в систему (как если бы вы входили через клиент терминала SSH). Затем оболочка представит командную строку и подождет, пока клиент / пользователь введет команды. Назначение канала shell - реализовать сеанс интерактивной оболочки. Это то, что каждый будет делать очень очень редко. Если вы это сделаете, вы обычно хотите использовать эмуляцию терминала (Paramiko invoke_shell делает это безоговорочно, но на самом деле можно открыть канал shell без эмуляции терминала). Клиенты SSH-терминала (такие как OpenSSH ssh или PuTTY), очевидно, используют канал shell при нормальных обстоятельствах.

  • Команда exec принимает команду в качестве «аргумента» и выполняет ее в изолированной среде & ndash; по-прежнему через пользовательскую оболочку по умолчанию, но не в качестве оболочки «входа», что может вызвать значительные различия в выполнении команды

    Типичный пример такого различия см. Некоторые команды Unix завершаются с ошибкой « not found», когда они выполняются с использованием Python Paramiko exec_command .

    Назначение канала exec - автоматизировать выполнение команды. Поэтому, как правило, вы не хотите использовать эмуляцию терминала, чтобы избежать использования команды для создания таких причудливых вещей, как нумерация страниц, раскраска и в основном интерактивные подтверждения. Вот почему значение по умолчанию get_pty равно False.

    exec канал используется OpenSSH ssh или PuTTY plink, когда вы указываете команду для выполнения в ее командной строке:

    ssh user@host command
    

С менее распространенными SSH-серверами разница может быть еще более существенной. Некоторые серверы могут даже не поддерживать один из каналов. Также довольно часто они, кажется, поддерживают оба, но один из них (обычно exec) полностью сломан.


Для Java / JSch есть похожий вопрос:
В чем разница между каналом 'shell' и каналом 'exec' в JSch

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