После того как помощник 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 и ресурсы, принадлежащие соединителю. Остановка чтений задачей сама по себе не закрывает активное соединение.

Похожие статьи