Una vez que un auxiliar HTTP CONNECT ha devuelto un túnel al servidor SSH previsto, entregue ese flujo a 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.

Sustituya el host del ejemplo y cargue los datos known-hosts correctos del despliegue. tunnel ya debe conducir a ese mismo servidor. El nombre de host que se pasa a connect identifica la clave de host SSH, no el proxy.

La interfaz sock acepta un socket abierto o un objeto similar a un socket. No negocia HTTP por usted. Antes de devolverlo, el conector debe:

  1. Conectarse al proxy y enviar una solicitud CONNECT válida para el destino.
  2. Completar cualquier autenticación de proxy admitida y validar un estado de túnel correcto.
  3. Leer toda la sección de cabeceras del proxy, gestionando lecturas parciales y conservando los bytes más allá del límite.
  4. Acotar la configuración y cerrar los sockets rechazados/erróneos mediante su ruta de limpieza.

Utilice un conector mantenido para ese trabajo. Buscar una frase de éxito en inglés en un solo búfer de recepción pasa por alto líneas de estado divididas, texto de motivo variable y cabeceras incompletas. Una conexión TCP de proxy correcta no es el túnel SSH aceptado.

El proxy debe permitir el puerto SSH solicitado; el permiso de navegación web no establece acceso CONNECT al puerto 22. Un 407 ocurre antes del inicio de sesión SSH, mientras que un fallo de cuenta SSH ocurre después del túnel. Mantenga esas cuentas separadas.

Cierre el cliente SSH y los recursos propiedad del conector cuando termine. Que una tarea detenga sus lecturas no cierra por sí mismo una conexión activa.

Artículos relacionados