Після того як помічник HTTP CONNECT повернув тунель до потрібного сервера SSH, передайте цей потік у Paramiko:

with paramiko.SSHClient() as client:
    client.load_system_host_keys()
    client.connect('ssh.example.com',
                   username='operator',
                   sock=tunnel,
                   banner_timeout=10,
                   auth_timeout=10)
    # Use the verified SSH connection.

Замініть приклад хоста й завантажте правильні дані known-hosts розгортання. tunnel уже має вести до того самого сервера. Ім’я хоста, передане в connect, визначає ключ хоста SSH, а не проксі.

Інтерфейс sock приймає відкритий сокет або схожий на сокет об’єкт. Він не узгоджує HTTP за вас. Перед поверненням з’єднувач має:

  1. Підключитися до проксі й надіслати дійсний запит CONNECT до призначення.
  2. Завершити будь-яку підтримувану автентифікацію проксі та перевірити успішний статус тунелю.
  3. Прочитати весь розділ заголовків проксі, обробляючи часткові читання та зберігаючи байти за межею.
  4. Обмежити налаштування й закрити відхилені/помилкові сокети через свій шлях очищення.

Використовуйте для цієї роботи підтримуваний з’єднувач. Пошук англійської фрази успіху в одному буфері приймання пропускає розділені рядки стану, змінний текст причини та неповні заголовки. Успішне TCP-з’єднання з проксі не є прийнятим тунелем SSH.

Проксі має дозволяти запитаний порт SSH; дозвіл на перегляд вебсторінок не створює доступ CONNECT до порту 22. 407 виникає до входу в SSH, а збій облікового запису SSH — після тунелю. Тримайте ці облікові записи окремо.

Після завершення закрийте клієнт SSH і ресурси, якими володіє з’єднувач. Зупинка читань завданням сама по собі не закриває активне з’єднання.

Схожі статті