Передача установленного туннеля HTTP CONNECT в Paramiko
Подключите Paramiko через разрешённый маршрут HTTP CONNECT, сохраняя проверку ключа узла SSH.
После того как помощник 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 за вас. Перед возвратом соединитель должен:
- Подключиться к прокси и отправить действительный запрос CONNECT к месту назначения.
- Завершить любую поддерживаемую аутентификацию прокси и проверить успешный статус туннеля.
- Прочитать весь раздел заголовков прокси, обрабатывая частичные чтения и сохраняя байты за границей.
- Ограничить настройку и закрыть отклонённые/ошибочные сокеты через свой путь очистки.
Используйте для этой работы поддерживаемый соединитель. Поиск английской фразы успеха в одном буфере приёма пропускает разделённые строки состояния, переменный текст причины и неполные заголовки. Успешное TCP-соединение с прокси не является принятым туннелем SSH.
Прокси должен разрешать запрошенный порт SSH; разрешение на просмотр веб-страниц не создаёт доступ CONNECT к порту 22. 407 возникает до входа в SSH, а сбой учётной записи SSH — после туннеля. Держите эти учётные записи отдельно.
По завершении закройте клиент SSH и ресурсы, принадлежащие соединителю. Остановка чтений задачей сама по себе не закрывает активное соединение.