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

Содержание статьи
- Что такое Paramiko?
- Установка Paramiko
- Пример использования Paramiko
- Paramiko в Python: обзор и применение
- Протокол SSH и роль Paramiko
- Зачем нужен Paramiko?
- Преимущества использования Paramiko
- Недостатки и ограничения
- Практические рекомендации
- Подключение по SSH-ключу
- Код возврата и ошибки команды
- Частые вопросы
Что такое 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:
- Автоматизация задач на удаленных серверах: Paramiko позволяет создавать скрипты на Python для выполнения операций на удаленных серверах, таких как запуск команд, управление файлами и т.д.
- Удаленное обновление ПО: С помощью Paramiko можно автоматизировать процесс обновления программного обеспечения на удаленных серверах, что упрощает поддержку и обслуживание систем.
- Проверка состояния серверов: Paramiko позволяет проверять состояние различных сервисов на удаленных серверах, например, через выполнение специфических команд или скриптов.
- Передача файлов: Благодаря Paramiko можно осуществлять передачу файлов между локальной машиной и удаленным сервером по протоколу SSH.
Преимущества использования Paramiko
Раздел включает: кроссплатформенность, гибкость и расширяемость, безопасность.
1. Кроссплатформенность
Paramiko поддерживает работу на различных операционных системах, таких как Windows, macOS и Linux, что делает его универсальным инструментом для работы с удаленными серверами.
2. Гибкость и расширяемость
Благодаря своему открытому исходному коду, Paramiko предоставляет разработчикам широкие возможности для настройки и расширения функциональности в соответствии с их потребностями.
3. Безопасность
Поскольку Paramiko использует протокол SSH, все соединения, установленные с его помощью, обеспечивают высокий уровень безопасности передачи данных.
Недостатки и ограничения
Раздел включает: сложность конфигурации, ограниченная поддержка некоторых протоколов.
1. Сложность конфигурации
Настройка и управление параметрами соединения (ключи, пароли и т.д.) может потребовать дополнительного времени и усилий, особенно при работе с большим количеством серверов.
2. Ограниченная поддержка некоторых протоколов
Хотя Paramiko поддерживает SSH и SFTP (для SCP нужен сторонний пакет scp), он может иметь ограниченную поддержку некоторых продвинутых возможностей, доступных в других библиотеках или инструментах.
Практические рекомендации
- Использование ключей SSH: Для повышения безопасности рекомендуется использовать аутентификацию по ключу SSH вместо пароля при подключении к серверам.
- Обработка ошибок: Важно корректно обрабатывать исключения при работе с Paramiko, чтобы избежать сбоев и обеспечить надежную работу вашего кода.
- Тестирование и отладка: Перед применением в продакшене тщательно тестируйте ваши скрипты, чтобы избежать непредвиденных ошибок при работе с удаленными серверами.
Заметка
При использовании 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.