Здесь действительно есть три варианта: сделать что-то в процессе (например, paramiko
), запустить ssh
напрямую (с subprocess
) и запустить ssh
с оболочкой (также с subprocess
). Как правило, избегайте программного запуска оболочки (в отличие, скажем, от интерактивного запроса пользователя).
Причина в том, что это ориентированный на человека интерфейс (таким образом, простое разделениеслов с пробелами и ярлыками для $HOME
и globbing), который значительно слабоват как API. Рассмотрим, например, как ваш код обнаружит, что ssh
отсутствует: ситуация с paramiko
не возникает (если установлено , это ), очевидно с subprocess
, иэто просто (неоднозначный) код выхода и сообщение stderr из оболочки. Также рассмотрите, как вы предоставляете команду для запуска: это уже должна быть команда, подходящая для оболочки (из-за ограничений в протоколе SSH), но если вы вызываете ssh
с оболочкой, это должна быть закодировано (иногда называемое «дважды сбежавший»), чтобы интерпретация локальной оболочки была желаемой многословной командой для удаленной оболочки.
Пока paramiko
и subprocess
в значительной степени эквивалентны. В качестве более сложного случая рассмотрим, как может проявиться сбой проверки ключа: paramiko
будет описывать сбой как data , тогда как другие будут пытаться взаимодействовать с пользователем (что можетили может не присутствовать). paramiko
также поддерживает открытие нескольких каналов через одно аутентифицированное соединение;ssh
делает то же самое, но только через сложную ControlMaster
конфигурацию, включающую файлы сокетов Unix (которые могут не иметь хорошего места для существования в некоторых развертываниях). Говоря о конфигурации, вам может потребоваться передать -F
, чтобы избежать осложнений со стороны пользователя .ssh/config
, если он не разработан с учетом этого автоматизированного варианта использования.
Таким образом, библиотеки предназначены для вариантов использования, подобных вашему, и поэтому неудивительно, что они работают лучше, особенно для крайних случаев, чем сборка собственного интерфейса из ориентированных на человека команд (хотя очень полезно, чтобы такие ручные композиции были возможными!). Если установка нестандартной зависимости, такой как paramiko
, обременительна, при минимум используйте subprocess
напрямую;вырезать вторую оболочку - это уже большое улучшение.