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

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

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

Ответ 1

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

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

ОБНОВИТЬ:

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

Ответ 2

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

Ткань - это библиотека 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


Позже: ткань больше не требует установки 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 - это вилка парамико, поддерживающая обе библиотеки одинаковы (Jeff Forcier, также автор Fabric) и сопровождающий планирует воссоединить парамико и ssh под именем paramiko. (Эта коррекция через pbanka.)

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

Просто используйте 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())

Ответ 11

Взгляните на 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)

Ответ 12

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 eg 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)