Python: уроки, справочник и задачи

Paramiko в Python: работа с серверами по SSH

Раздел: Модули и библиотеки Python · Обновлено 31.10.2026

Python paramiko - библиотека, которая реализует протокол SSH на чистом Python и позволяет из скрипта подключаться к серверу, выполнять команды и передавать файлы по SFTP. В статье показаны установка, вход по паролю и по ключу, запуск команд с проверкой кода возврата, обмен файлами и обработка типичных ошибок соединения.

Python является одним из самых популярных языков программирования благодаря своей гибкости и мощным возможностям. Среди множества библиотек, существующих для Python, особое внимание заслуживает Paramiko - библиотека, предназначенная для работы с протоколами SSH.

python paramiko
Фото: NOIRLab/NSF/AURA/T. Slovinský / CC BY 4.0, Wikimedia Commons
Содержание статьи
  1. Что такое Paramiko?
  2. Установка Paramiko
  3. Пример использования Paramiko
  4. Paramiko в Python: обзор и применение
  5. Протокол SSH и роль Paramiko
  6. Зачем нужен Paramiko?
  7. Преимущества использования Paramiko
  8. Недостатки и ограничения
  9. Практические рекомендации
  10. Подключение по SSH-ключу
  11. Код возврата и ошибки команды
  12. Частые вопросы

Что такое Paramiko?

Paramiko - это библиотека Python, которая позволяет осуществлять подключение к удаленным серверам по протоколу SSH. Это делает Paramiko идеальным инструментом для автоматизации задач, требующих взаимодействия с удаленными серверами.

Установка Paramiko

Установить Paramiko очень просто с помощью менеджера пакетов pip:

pip install paramiko

Пример использования Paramiko

Простой пример использования Paramiko для подключения к удаленному серверу и выполнения команды:

1. Подключение к удаленному серверу

import paramiko
# Создаем объект SSHClient
client = paramiko.SSHClient()
# Устанавливаем политику подключения (не рекомендуется для продакшена)
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Подключаемся к серверу
client.connect('hostname', username='user', password='password')
# Выполняем команду на сервере
stdin, stdout, stderr = client.exec_command('ls')
# Выводим результат выполнения команды
print(stdout.read().decode())
# Закрываем соединение
client.close()

2. Передача файла на удаленный сервер

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('hostname', username='user', password='password')
sftp = client.open_sftp()
local_file_path = 'local_file.txt'
remote_file_path = '/path/to/remote_file.txt'
sftp.put(local_file_path, remote_file_path)
sftp.close()
client.close()

Этот код устанавливает соединение с удаленным сервером по SSH и передает локальный файл local_file.txt на удаленный сервер по указанному пути.

3. Скачивание файла с удаленного сервера

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('hostname', username='user', password='password')
sftp = client.open_sftp()
remote_file_path = '/path/to/remote_file.txt'
local_file_path = 'downloaded_file.txt'
sftp.get(remote_file_path, local_file_path)
sftp.close()
client.close()

Этот пример устанавливает соединение с удаленным сервером по SSH и скачивает файл remote_file.txt с сервера на локальную машину.

4. Выполнение нескольких команд подряд

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('hostname', username='user', password='password')
commands = [
    'ls',
    'echo "Hello, World!"'
]
for command in commands:
    stdin, stdout, stderr = client.exec_command(command)
    print(stdout.read().decode())
client.close()

Этот код устанавливает соединение с удаленным сервером по SSH и последовательно выполняет несколько команд (список commands) на сервере, выводя результат каждой команды.

Paramiko в Python: обзор и применение

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

Протокол SSH и роль Paramiko

Paramiko - это библиотека Python, предназначенная для работы с протоколами SSH (Secure Shell). SSH является широко используемым протоколом для безопасного удаленного доступа к серверам и передачи данных. Paramiko позволяет создавать защищенные соединения SSH, выполнять команды на удаленных серверах, передавать файлы и многое другое.

Зачем нужен Paramiko?

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

  1. Автоматизация задач на удаленных серверах: Paramiko позволяет создавать скрипты на Python для выполнения операций на удаленных серверах, таких как запуск команд, управление файлами и т.д.
  2. Удаленное обновление ПО: С помощью Paramiko можно автоматизировать процесс обновления программного обеспечения на удаленных серверах, что упрощает поддержку и обслуживание систем.
  3. Проверка состояния серверов: Paramiko позволяет проверять состояние различных сервисов на удаленных серверах, например, через выполнение специфических команд или скриптов.
  4. Передача файлов: Благодаря Paramiko можно осуществлять передачу файлов между локальной машиной и удаленным сервером по протоколу SSH.

Преимущества использования Paramiko

Раздел включает: кроссплатформенность, гибкость и расширяемость, безопасность.

1. Кроссплатформенность

Paramiko поддерживает работу на различных операционных системах, таких как Windows, macOS и Linux, что делает его универсальным инструментом для работы с удаленными серверами.

2. Гибкость и расширяемость

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

3. Безопасность

Поскольку Paramiko использует протокол SSH, все соединения, установленные с его помощью, обеспечивают высокий уровень безопасности передачи данных.

Недостатки и ограничения

Раздел включает: сложность конфигурации, ограниченная поддержка некоторых протоколов.

1. Сложность конфигурации

Настройка и управление параметрами соединения (ключи, пароли и т.д.) может потребовать дополнительного времени и усилий, особенно при работе с большим количеством серверов.

2. Ограниченная поддержка некоторых протоколов

Хотя Paramiko поддерживает SSH и SFTP (для SCP нужен сторонний пакет scp), он может иметь ограниченную поддержку некоторых продвинутых возможностей, доступных в других библиотеках или инструментах.

Практические рекомендации

  1. Использование ключей SSH: Для повышения безопасности рекомендуется использовать аутентификацию по ключу SSH вместо пароля при подключении к серверам.
  2. Обработка ошибок: Важно корректно обрабатывать исключения при работе с Paramiko, чтобы избежать сбоев и обеспечить надежную работу вашего кода.
  3. Тестирование и отладка: Перед применением в продакшене тщательно тестируйте ваши скрипты, чтобы избежать непредвиденных ошибок при работе с удаленными серверами.

Заметка

При использовании Paramiko для работы с удаленными серверами, рекомендуется обеспечить безопасность соединения и правильно обрабатывать ошибки для надежной и эффективной работы ваших скриптов.

Подключение по SSH-ключу

Пароль в коде скрипта небезопасен, поэтому на рабочих серверах входят по ключу. Путь к закрытому ключу передают в параметре key_filename, а если ключ защищен фразой, ее указывают в passphrase. Вместо AutoAddPolicy лучше загрузить известные ключи хостов из ~/.ssh/known_hosts методом load_system_host_keys(): тогда подмена сервера вызовет ошибку, а не тихое подключение.

from pathlib import Path
import paramiko

key = Path.home() / ".ssh" / "id_ed25519"

with paramiko.SSHClient() as client:
    client.load_system_host_keys()
    client.connect("example.com", username="deploy",
                   key_filename=str(key), timeout=10)
    _, stdout, _ = client.exec_command("uptime")
    print(stdout.read().decode().strip())

Объект SSHClient поддерживает менеджер контекста, поэтому соединение закроется даже при исключении внутри блока with.

Код возврата и ошибки команды

exec_command() возвращает три потока: stdin, stdout и stderr. Сам вызов не ждет завершения команды, а успешность нужно проверять по коду возврата: stdout.channel.recv_exit_status() блокирует выполнение до конца команды и возвращает число, где 0 означает успех.

stdin, stdout, stderr = client.exec_command("ls /nope")
code = stdout.channel.recv_exit_status()
if code != 0:
    print("Ошибка", code, stderr.read().decode())
# Ошибка 2 ls: cannot access '/nope': No such file or directory

Сбои самого соединения выдаются исключениями: paramiko.AuthenticationException при неверном логине или ключе, paramiko.SSHException при ошибках протокола, socket.timeout или TimeoutError при недоступном хосте. Их перехватывают обычным блоком try/except, подробнее о нем в статье про обработку исключений.

Частые вопросы

Короткие ответы на вопросы, с которыми сталкиваются при первом знакомстве с paramiko.

Как установить paramiko?

Командой pip install paramiko, лучше внутри виртуального окружения. Библиотека не входит в стандартную поставку Python и тянет за собой пакеты cryptography, bcrypt и pynacl.

Почему exec_command зависает на большой выдаче?

Если команда пишет много данных в stderr, а читается только stdout, буфер канала переполняется и процесс на сервере ждет. Читайте оба потока или объедините их вызовом stdout.channel.set_combined_stderr(True).

Как выполнить команду через sudo?

Передайте get_pty=True в exec_command() и запишите пароль в stdin: stdin.write("пароль\n"), затем stdin.flush(). Надежнее настроить на сервере sudo без пароля для конкретной команды.

Чем paramiko отличается от Fabric и asyncssh?

Fabric построен поверх paramiko и добавляет удобные функции для деплоя и запуска задач на группе хостов. asyncssh работает в асинхронном стиле и подходит, когда нужно одновременно обслуживать сотни соединений.

Поддерживает ли paramiko SCP?

Встроенного SCP нет, для передачи файлов используют SFTP через open_sftp(). Если сервер принимает только SCP, подключают сторонний пакет scp, который работает поверх транспорта paramiko.