Paramiko – SSH-клиент

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

В условиях современных DevOps- и SecOps-практик программный доступ к удалённым серверам стал необходимостью. Одним из самых надёжных и мощных способов взаимодействия с удалёнными хостами через Python является библиотека Paramiko. Она предоставляет реализацию протокола SSH2, позволяя подключаться к серверам, выполнять команды, передавать файлы и строить автоматизированные системы управления инфраструктурой.

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

Основная часть

Что такое Paramiko

Paramiko — это Python-имплементация протокола SSH2. Название происходит от «parallel» + «miko» (мико — жрица в японской культуре). Основной задачей библиотеки является обеспечение защищённого канала передачи данных между хостами с возможностью аутентификации через пароли или ключи.

Ключевые особенности

  • Полная реализация SSH2

  • Поддержка RSA/DSS-ключей

  • SCP и SFTP протоколы

  • Совместимость с Python 3.6+

  • Высокий уровень надёжности

Установка

pip install paramiko

Архитектура и классы

paramiko.SSHClient

Основной интерфейс для создания SSH-сессий. Управляет установкой соединения и каналами.

Метод Описание
connect() Подключение к серверу
exec_command() Выполнение команды
open_sftp() Инициализация SFTP-сессии
load_system_host_keys() Загрузка известных хостов
set_missing_host_key_policy() Поведение при новом хосте

Пример подключения и выполнения команды

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.0.1', username='user', password='pass')
stdin, stdout, stderr = client.exec_command('ls -la')
print(stdout.read().decode())
client.close()

paramiko.SFTPClient

Позволяет передавать файлы через SFTP.

Метод Назначение
put(local, remote) Отправка файла
get(remote, local) Скачивание файла
listdir(path) Список файлов
mkdir(path) Создание директории
remove(path) Удаление файла

Аутентификация

Через пароль

client.connect(hostname, username, password)

Через ключ

key = paramiko.RSAKey.from_private_key_file('/path/to/key')
client.connect(hostname, userВведение

В условиях современных DevOps- и SecOps-практик программный доступ к удалённым серверам стал необходимостью. Одним из самых надёжных и мощных способов взаимодействия с удалёнными хостами через Python является библиотека Paramiko. Она предоставляет реализацию протокола SSH2, позволяя подключаться к серверам, выполнять команды, передавать файлы и строить автоматизированные системы управления инфраструктурой.

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

Основная часть

Что такое Paramiko

Paramiko — это Python-имплементация протокола SSH2. Название происходит от «parallel» + «miko» (мико — жрица в японской культуре). Основной задачей библиотеки является обеспечение защищённого канала передачи данных между хостами с возможностью аутентификации через пароли или ключи.

Ключевые особенности

Полная реализация SSH2

Поддержка RSA/DSS-ключей

SCP и SFTP протоколы

Совместимость с Python 3.6+

Высокий уровень надёжности

Установка

pip install paramiko

Архитектура и классы

paramiko.SSHClient

Основной интерфейс для создания SSH-сессий. Управляет установкой соединения и каналами.

Метод

Описание

connect()

Подключение к серверу

exec_command()

Выполнение команды

open_sftp()

Инициализация SFTP-сессии

load_system_host_keys()

Загрузка известных хостов

set_missing_host_key_policy()

Поведение при новом хосте

Пример подключения и выполнения команды

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.0.1', username='user', password='pass')
stdin, stdout, stderr = client.exec_command('ls -la')
print(stdout.read().decode())
client.close()

paramiko.SFTPClient

Позволяет передавать файлы через SFTP.

Метод

Назначение

put(local, remote)

Отправка файла

get(remote, local)

Скачивание файла

listdir(path)

Список файлов

mkdir(path)name=username, pkey=key)

Поддерживаемые типы ключей

  • RSA

  • DSS

  • ECDSA

  • Ed25519

Работа с каналами

Канал через invoke_shell()

Позволяет создавать интерактивные сеансы:

chan = client.invoke_shell()
chan.send('top\n')
print(chan.recv(1024).decode())

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

  • Используйте только авторизованные ключи

  • Проверяйте хосты через known_hosts

  • Не сохраняйте пароли в коде

  • Используйте политики RejectPolicy, WarningPolicy, AutoAddPolicy в зависимости от контекста

Ошибки и отладка

Исключение Описание
AuthenticationException Ошибка авторизации
SSHException Общая ошибка SSH
BadHostKeyException Несовпадение ключа хоста

Используйте logging для отладки:

paramiko.util.log_to_file("paramiko.log")

Практические кейсы

Массовое выполнение команд

for host in ['192.168.1.1', '192.168.1.2']:
    client.connect(host, username='admin', password='1234')
    stdin, stdout, stderr = client.exec_command('uptime')
    print(host, stdout.read().decode())
    client.close()

Резервное копирование файлов через SFTP

sftp = client.open_sftp()
sftp.get('/etc/nginx/nginx.conf', 'nginx.conf.backup')
sftp.close()

Автоматизация CI/CD

Paramiko используется в Jenkins, Ansible, Fabric для кастомных скриптов деплоя и управления сервисами.

Продвинутые темы

Обработка stdout и stderr по потокам

stdin, stdout, stderr = client.exec_command('bash script.sh')
for line in stdout:
    print(line.strip())

Подключение к jump-серверу (bastion)

Можно использовать Transport для построения туннелей:

jump = paramiko.SSHClient()
jump.connect('jump.host', username='jumpuser')
t = jump.get_transport()
dest_addr = ('dest.host', 22)
local_addr = ('', 0)
channel = t.open_channel('direct-tcpip', dest_addr, local_addr)

client = paramiko.SSHClient()
client.connect('dest.host', sock=channel, username='user')

API и внутренние классы

Transport

Низкоуровневый канал передачи данных

Channel

Абстракция для командного сеанса, взаимодействия с потоками ввода/вывода.

PKey

Базовый класс для всех ключей (RSAKey, DSSKey, Ed25519Key).

Сравнение с альтернативами

Библиотека Язык Поддержка SSH Уровень
Paramiko Python Полная Высокий
Netmiko Python Ограниченная Средний
OpenSSH CLI Полная Очень высокий

Основные методы

Метод Описание
connect() Устанавливает SSH-соединение с сервером.
exec_command() Выполняет команду на удалённом сервере.
invoke_shell() Создаёт интерактивную оболочку (shell).
load_system_host_keys() Загружает системные host-ключи (из ~/.ssh/known_hosts).
set_missing_host_key_policy() Устанавливает политику при отсутствии host-ключа (AutoAddPolicyWarningPolicyRejectPolicy).
close() Закрывает соединение.

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

python
 
Copy
 
Download
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # Автодобавление ключа
ssh.connect('hostname', username='user', password='pass')

stdin, stdout, stderr = ssh.exec_command('ls -la')
print(stdout.read().decode())

ssh.close()

2. SFTPClient – передача файлов по SFTP

Класс для работы с файлами через SFTP.

Основные методы

Метод Описание
put(localpath, remotepath) Загружает файл на сервер.
get(remotepath, localpath) Скачивает файл с сервера.
mkdir(path) Создаёт директорию.
remove(path) Удаляет файл.
rename(oldpath, newpath) Переименовывает файл.
listdir(path) Возвращает список файлов.
stat(path) Получает информацию о файле.
chmod(path, mode) Меняет права доступа.
close() Закрывает SFTP-сессию.

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

python
 
Copy
 
Download
import paramiko

transport = paramiko.Transport(('hostname', 22))
transport.connect(username='user', password='pass')
sftp = paramiko.SFTPClient.from_transport(transport)

sftp.put('local_file.txt', 'remote_file.txt')  # Загрузка файла
sftp.get('remote_file.txt', 'downloaded.txt')  # Скачивание файла

sftp.close()
transport.close()

3. Transport – низкоуровневое управление SSH

Класс для управления SSH-соединением без SSHClient.

Основные методы

Метод Описание
connect() Устанавливает соединение.
open_session() Создаёт SSH-сессию.
open_sftp_client() Создаёт SFTP-клиент.
is_active() Проверяет активность соединения.
close() Закрывает соединение.

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

python
 
Copy
 
Download
import paramiko

transport = paramiko.Transport(('hostname', 22))
transport.connect(username='user', password='pass')

sftp = transport.open_sftp_client()
sftp.put('file.txt', 'remote.txt')

transport.close()

4. Классы ключей (RSAKey, DSSKey, ECDSAKey, Ed25519Key)

Используются для аутентификации по ключу.

Основные методы

Метод Описание
from_private_key_file() Загружает приватный ключ из файла.
generate() Генерирует новый ключ.
write_private_key_file() Сохраняет ключ в файл.

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

python
 
Copy
 
Download
import paramiko

key = paramiko.RSAKey.from_private_key_file('id_rsa')
ssh = paramiko.SSHClient()
ssh.connect('hostname', username='user', pkey=key)

5. Agent – работа с SSH-агентом

Используется для аутентификации через SSH-агент (например, ssh-agent в Linux).

Основные методы

Метод Описание
get_keys() Возвращает список доступных ключей.

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

python
 
Copy
 
Download
import paramiko

agent = paramiko.Agent()
keys = agent.get_keys()
ssh = paramiko.SSHClient()
ssh.connect('hostname', username='user', pkey=keys[0])

6. ServerInterface – создание SSH-сервера

Используется для создания собственного SSH-сервера.

Основные методы

Метод Описание
check_auth_password() Проверяет пароль.
check_auth_publickey() Проверяет публичный ключ.
check_channel_request() Проверяет запрос на открытие канала.

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

python
 
Copy
 
Download
import paramiko
import socket

class MyServer(paramiko.ServerInterface):
    def check_auth_password(self, username, password):
        return paramiko.AUTH_SUCCESSFUL if password == "1234" else paramiko.AUTH_FAILED

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('0.0.0.0', 2222))
sock.listen(1)
client, addr = sock.accept()

transport = paramiko.Transport(client)
transport.add_server_key(paramiko.RSAKey.generate(2048))
transport.start_server(server=MyServer())

Заключение

Paramiko — это не просто инструмент для подключения к серверу. Это фундамент для построения собственных систем удалённого управления, автоматизации и деплоя. Благодаря простоте и расширяемости он остаётся выбором №1 среди DevOps-инженеров.