it-swarm.com.ru

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

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

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

78
Christopher Tokar

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

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

Обновление:

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

39
ThomasH

Вы можете написать его самостоятельно, используя 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 и 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 под именем paramiko . (Это исправление через pbanka .)

60
hughdbrown

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

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

24
Neil

Я написал привязки 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)
17
Sebastian Noack

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

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

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

8
Cascabel

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

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

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

6
juanjux

Я обнаружил, что 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)
6
Michael Williamson

Для пользы тех, кто достигает здесь googling для примера Python SSH .. Оригинальный вопрос и ответ уже почти старый декодер . Кажется, что 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 Он работает для меня.

3
oceanuz

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

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
1
Naveen

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)
0
Harshan Gowda

Взгляните на spurplus , обертку вокруг spur и paramiko , которую мы разработали для управления удаленными машинами и выполнения файловых операций.

Spurplus предоставляет функцию check_output() "из коробки":

import spurplus
with spurplus.connect_with_retries(
        hostname='some-machine.example.com', username='devop') as Shell:
     out = Shell.check_output(['/path/to/the/command', '--some_argument']) 
     print(out)
0
marko.ristin