Какой самый простой способ SSH с использованием Python? - PullRequest
78 голосов
/ 05 августа 2009

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

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

Ответы [ 11 ]

60 голосов
/ 05 августа 2009

Вы можете кодировать его самостоятельно, используя 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 с тканью

Инструменты современного Python Hacker: Virtualenv, Fabric and 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 - это ветвь paramiko, сопровождающий для обеих библиотек одинаковый (Джефф Форсьер, также автор Fabric), а сопровождающий планирует воссоединить paramiko и ssh под имя парамико . (Это исправление через pbanka .)

39 голосов
/ 05 августа 2009

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

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

UPDATE:

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

24 голосов
/ 05 августа 2009

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

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 или установить открытый ключ на сервере, чтобы избежать запроса пароля.

17 голосов
/ 28 февраля 2011

Я написал Привязки 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)
8 голосов
/ 05 августа 2009

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

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

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

6 голосов
/ 11 января 2013

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

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)
6 голосов
/ 06 августа 2009

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

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

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

3 голосов
/ 21 июня 2018

В пользу тех, кто добирается сюда, гуглится на Python ssh sample. Оригинальный вопрос и ответ уже почти расшифрованы. Похоже, что у Paramiko есть некоторые функциональные возможности (хорошо. Я признаю - просто догадка - я новичок в Python), и вы можете создать ssh-клиент непосредственно с Paramiko.

import base64
import paramiko

client = paramiko.SSHClient()

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.1', username='user', password='password')
stdin, stdout, stderr = client.exec_command('cat /proc/meminfo')
for line in stdout:
    print('... ' + line.strip('\n'))
client.close()

Этот код был адаптирован из демо https://github.com/paramiko/paramiko У меня это работает.

1 голос
/ 11 мая 2019

please refer to paramiko.org, its very useful while doing ssh using python.

импорт парамико

время импорта

ssh = paramiko.SSHClient () #SSHClient () является объектом paramiko

'' 'В следующих строках автоматически добавляется ключ сервера в файл know_hosts. Используйте любого из нижеприведенных' ''

ssh.load_system_host_keys ()

ssh.set_missing_host_key_policy (paramiko.AutoAddPolicy ())

попробовать:

Здесь мы фактически подключаемся к серверу.

ssh.connect('10.106.104.24', port=22, username='admin', password='')

time.sleep(5)

I have mentioned time because some servers or endpoint prints there own information after loggin in e.g. the version, model and uptime information, so its better to give some time before executing the command.

Here we execute the command, stdin for input, stdout for output, stderr for error

stdin, stdout, stderr = ssh.exec_command('xstatus Time')

Здесь мы читаем строки из вывода.

output = stdout.readlines() 

print(output)

Below all are the Exception handled by paramiko while ssh. Refer to paramiko.org for more information about exception.

кроме (BadHostKeyException, AuthenticationException,
SSHException, socket.error) как e:

print(e)
1 голос
/ 22 декабря 2015

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...