Каков самый простой способ использования SSH с помощью Python?

Как я могу просто SSH на удаленном сервере с локального сценария Python (3.0), предоставить логин / пароль, выполнить команду и распечатать вывод на консоль Python?

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

9 Solutions collect form web for “Каков самый простой способ использования SSH с помощью Python?”

Я не пробовал, но этот модуль pysftp мог бы помочь, что в свою очередь использует paramiko. Я считаю, что все клиентское.

Интересной командой, вероятно, является .execute() которая выполняет произвольную команду на удаленной машине. (Модуль также имеет .get() и .put которые больше ссылаются на его символ FTP).

ОБНОВИТЬ:

Я переписал ответ после того, как сообщение в блоге, с которым я первоначально связано, больше не доступно. Некоторые комментарии, относящиеся к старой версии этого ответа, теперь будут выглядеть странно.

Вы можете запрограммировать его самостоятельно, используя Paramiko, как было предложено выше. Кроме того, вы можете посмотреть приложение Fabric, приложение python для выполнения всех вещей, о которых вы просили:

Fabric – это библиотека Python и средство командной строки, предназначенное для оптимизации развертывания приложений или выполнения задач администрирования системы по протоколу SSH. Он предоставляет инструменты для запуска произвольных команд оболочки (либо как обычный пользователь входа в систему, либо через sudo), загрузки и загрузки файлов и т. Д.

Я думаю, это соответствует вашим потребностям. Это также не большая библиотека и не требует установки сервера, хотя у нее есть зависимости от paramiko и pycrypt, которые требуют установки на клиенте.

Приложение было здесь . Теперь его можно найти здесь .

 * The official, canonical repository is git.fabfile.org * The official Github mirror is GitHub/bitprophet/fabric 

На нем есть несколько хороших статей, хотя вы должны быть осторожны, потому что за последние шесть месяцев он изменился:

Развертывание Django с помощью Fabric

Инструменты современного Python Hacker: Virtualenv, Fabric и Pip

Простое и простое развертывание с использованием Fabric и Virtualenv


Позже: Fabric больше не требует установки paramiko:

 $ pip install fabric Downloading/unpacking fabric Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded Running setup.py egg_info for package fabric warning: no previously-included files matching '*' found under directory 'docs/_build' warning: no files found matching 'fabfile.py' Downloading/unpacking ssh>=1.7.14 (from fabric) Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded Running setup.py egg_info for package ssh Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric) Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded Running setup.py egg_info for package pycrypto Installing collected packages: fabric, ssh, pycrypto Running setup.py install for fabric warning: no previously-included files matching '*' found under directory 'docs/_build' warning: no files found matching 'fabfile.py' Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin Running setup.py install for ssh Running setup.py install for pycrypto ... Successfully installed fabric ssh pycrypto Cleaning up... 

Это, в основном, косметическое: ssh – это вилка парамико, поддерживающая обе библиотеки одинаковы (Джефф Форсьер, также автор Fabric), а сопровождающий планирует воссоединить парамико и ssh под именем paramiko . (Эта коррекция через pbanka .)

Если вы хотите избежать каких-либо дополнительных модулей, вы можете использовать модуль подпроцесса для запуска

 ssh [host] [command] 

и захватить вывод.

Попробуйте что-нибудь вроде:

 process = subprocess.Popen("ssh example.com ls", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output,stderr = process.communicate() status = process.poll() print output 

Чтобы иметь дело с именами пользователей и паролями, вы можете использовать подпроцесс для взаимодействия с процессом ssh или вы можете установить открытый ключ на сервере, чтобы избежать запроса пароля.

Я написал Python привязки для libssh2 . Libssh2 – это клиентская библиотека, реализующая протокол SSH2.

 import socket import libssh2 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('exmaple.com', 22)) session = libssh2.Session() session.startup(sock) session.userauth_password('john', '******') channel = session.channel() channel.execute('ls -l') print channel.read(1024) 

Ваше определение «простейшее» здесь важно – простой код означает использование модуля (хотя «большая внешняя библиотека» является преувеличением).

Я считаю, что самым современным (активно разработанным) модулем является парамико . Он поставляется с демонстрационными скриптами в загрузке и содержит подробную онлайн-документацию API. Вы также можете попробовать PxSSH , который содержится в pexpect . Рядом с документацией есть первая ссылка.

Снова в отношении простоты обратите внимание, что хорошее обнаружение ошибок всегда сделает ваш код более сложным, но вы должны иметь возможность повторно использовать много кода из сценариев образца, а затем забыть об этом.

Как и hughdbrown, мне нравится Fabric. Обратите внимание, что в то время как он реализует свой собственный декларативный скриптинг (для развертывания и того, что такое), он также может быть импортирован как модуль Python и использован в ваших программах без необходимости писать сценарий Fabric.

Ткань имеет нового сопровождающего и находится в процессе перезаписи; это означает, что большинство учебных пособий, которые вы (в настоящее время) найдете в Интернете, не будут работать с текущей версией. Кроме того, Google по-прежнему показывает старую страницу Fabric как первый результат.

Для актуальной документации вы можете проверить: http://docs.fabfile.org

Я нашел paramiko слишком низкоуровневым, и Fabric не особенно хорошо подходит для использования в качестве библиотеки, поэтому я собрал свою собственную библиотеку под названием spur, которая использует paramiko для реализации немного более приятного интерфейса:

 import spur shell = spur.SshShell(hostname="localhost", username="bob", password="password1") result = shell.run(["echo", "-n", "hello"]) print result.output # prints hello 

Вы также можете печатать выходные данные программы по мере ее запуска, что полезно, если вы хотите увидеть вывод длинных команд до выхода:

 result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout) 

Это сработало для меня

 import subprocess import sys HOST="IP" COMMAND="ifconfig" def passwordless_ssh(HOST): ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result = ssh.stdout.readlines() if result == []: error = ssh.stderr.readlines() print >>sys.stderr, "ERROR: %s" % error return "error" else: return result 

Просто используйте ssh_decorate

 from ssh_decorate import ssh_connect ssh=ssh_connect('user','password','server') #Run a python function @ssh def python_pwd(): import os return os.getcwd() print (python_pwd()) 
  • В чем разница между константами AF_INET и PF_INET?
  • Проверка запуска скрипта python в скрипте python
  • Вызов команды «source» из подпроцесса. Popen
  • как использовать «/» (разделитель каталогов) в Linux и Windows?
  • Как сделать python, программа командной строки autocomplete произвольные вещи НЕ интерпретатор
  • BrokenPipeError в Python
  • Как изменить каталоги с помощью Paramiko?
  • Захват статуса выхода процесса Python в оболочке UNIX
  • Python - лучший язык программирования в мире.