Открыть сервис

paramiko

Paramiko — это библиотека для языка программирования Python, реализующая протокол SSHv2 (Secure Shell) для защищённого сетевого взаимодействия. Paramiko предоставляет как клиентскую, так и серверную части протокола, позволяя программам на Python устанавливать зашифрованные соединения с удалёнными серверами, выполнять команды, передавать файлы и управлять аутентификацией. Название библиотеки происходит от комбинации слов «параноик» (англ. paranoid) и «Мико» (яп. ミコ, «святилище»), что отражает акцент на безопасности и шифровании.

История

Библиотека Paramiko была создана Робом «Robby» Харрисом и впервые опубликована в 2003 году. Первоначально она разрабатывалась как часть проекта по автоматизации управления серверами, где требовалась надёжная и гибкая реализация SSH на чистом Python. В отличие от многих других SSH-реализаций того времени, Paramiko не требовала установки внешних библиотек, таких как OpenSSL, и полностью полагалась на встроенные криптографические модули Python (позже — на библиотеку PyCrypto или Cryptography).

В 2006 году Paramiko стала частью пакета программного обеспечения для управления сетями и серверами, включая такие проекты, как Ansible (система управления конфигурациями) и Fabric (инструмент для развёртывания и администрирования). К 2010-м годам Paramiko превратилась в одну из самых популярных библиотек Python для работы с SSH, поддерживаемую сообществом и используемую в тысячах проектов по всему миру. Основные версии (1.x, 2.x) выпускались с 2010 по 2020 год, а версия 3.0 была выпущена в 2022 году, введя значительные изменения в API и требования к зависимостям.

Архитектура и основные компоненты

Paramiko построена на модульной архитектуре, включающей несколько ключевых компонентов:

Транспортный уровень (Transport)

Transport — это низкоуровневый класс, управляющий сетевым соединением, шифрованием и аутентификацией. Он реализует протокол SSHv2, включая согласование алгоритмов шифрования (AES, ChaCha20, 3DES), хэширования (HMAC-SHA256, HMAC-SHA1) и обмена ключами (Diffie-Hellman, ECDH). Transport поддерживает как TCP-соединения, так и Unix-сокеты.

Клиент (SSHClient)

SSHClient — высокоуровневый класс для клиентских операций. Он автоматизирует процесс подключения: устанавливает транспорт, выполняет аутентификацию (по паролю, по ключу, с использованием агента SSH) и предоставляет методы для выполнения команд (exec_command), открытия каналов (invoke_shell) и передачи файлов (через SFTP). SSHClient также поддерживает проверку ключа хоста (host key verification) для защиты от атак «человек посередине».

Сервер (ServerInterface)

ServerInterface — абстрактный класс для реализации серверной части SSH. Разработчик может создать собственный SSH-сервер, переопределив методы для аутентификации, обработки каналов и выполнения команд. Это используется для создания тестовых сред, прокси-серверов или специализированных приложений (например, SSH-туннелей для доступа к внутренним ресурсам).

Каналы (Channel)

Channel — класс, представляющий логическое соединение внутри SSH-сессии. Каналы могут быть интерактивными (терминальные сессии) или неинтерактивными (выполнение одной команды). Через каналы передаются данные в виде потоков (stdin, stdout, stderr). Paramiko поддерживает до нескольких тысяч одновременных каналов на одно транспортное соединение.

SFTP (SFTPClient и SFTPServer)

SFTPClient — реализация протокола SFTP (SSH File Transfer Protocol) для передачи файлов. Поддерживает операции: listdir, get, put, remove, rename, stat, chmod и другие. SFTPServer — серверная часть для приёма SFTP-запросов.

Классификация и виды

Paramiko можно классифицировать по функциональному назначению:

Применение

Paramiko широко применяется в различных областях:

Администрирование и DevOps

Разработка и тестирование

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

Научные и исследовательские проекты

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

Базовое подключение и выполнение команды

```python import paramiko

client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect('example.com', username='user', password='pass')

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

client.close() ```

Передача файла через SFTP

```python import paramiko

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

sftp.put('local_file.txt', '/remote/path/file.txt') sftp.get('/remote/path/file.txt', 'local_copy.txt')

sftp.close() transport.close() ```

Создание простого SSH-сервера

```python import paramiko import socket

class MyServer(paramiko.ServerInterface): def check_auth_password(self, username, password): if username == 'admin' and password == 'secret': return paramiko.AUTH_SUCCESSFUL return paramiko.AUTH_FAILED

def check_channel_request(self, kind, chanid): if kind == 'session': return paramiko.OPEN_SUCCEEDED return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 2222)) server_socket.listen(5)

while True: client_socket, addr = server_socket.accept() transport = paramiko.Transport(client_socket) transport.add_server_key(paramiko.RSAKey.generate(2048)) transport.start_server(server=MyServer()) ```

Критика и ограничения

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →