Dopo che un helper HTTP CONNECT ha restituito un tunnel al server SSH previsto, consegnate quel flusso 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.

Sostituite l’host di esempio e caricate i dati known-hosts corretti della distribuzione. tunnel deve già condurre a quello stesso server. Il nome host passato a connect identifica la chiave host SSH, non il proxy.

L’interfaccia sock accetta un socket aperto o un oggetto simile a un socket. Non negozia HTTP al posto vostro. Prima di restituirlo, il connettore deve:

  1. Collegarsi al proxy e inviare una richiesta CONNECT valida per la destinazione.
  2. Completare qualsiasi autenticazione proxy supportata e convalidare uno stato del tunnel riuscito.
  3. Leggere l’intera sezione delle intestazioni del proxy, gestendo letture parziali e conservando i byte oltre il limite.
  4. Delimitare la configurazione e chiudere i socket rifiutati/errati tramite il suo percorso di pulizia.

Usate un connettore mantenuto per quel lavoro. Cercare una frase di successo in inglese in un solo buffer di ricezione trascura righe di stato spezzate, testo del motivo variabile e intestazioni incomplete. Una connessione TCP proxy riuscita non è il tunnel SSH accettato.

Il proxy deve consentire la porta SSH richiesta; l’autorizzazione alla navigazione web non stabilisce l’accesso CONNECT alla porta 22. Un 407 si verifica prima dell’accesso SSH, mentre un errore dell’account SSH si verifica dopo il tunnel. Tenete separati questi account.

Chiudete il client SSH e le risorse possedute dal connettore al termine. L’arresto delle letture da parte di un’attività non chiude di per sé una connessione attiva.

Articoli correlati