Passa al client SSH di Go la connessione aperta da SOCKS
Componi la destinazione SSH con x/net/proxy, poi inizializza x/crypto/ssh sul net.Conn risultante.
Il dialer SOCKS fornisce il trasporto; il pacchetto SSH esegue la stretta di mano SSH sopra di esso. Chiamare poi ssh.Dial creerebbe una connessione separata invece di usare quel trasporto.
Una funzione di supporto in un'applicazione che usa già x/net/proxy e x/crypto/ssh può restituire il client SSH configurato:
func dialSSHViaSOCKS(proxyAddr, sshAddr string,
config *ssh.ClientConfig) (*ssh.Client, error) {
dialer, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct)
if err != nil {
return nil, err
}
conn, err := dialer.Dial("tcp", sshAddr)
if err != nil {
return nil, err
}
transport, channels, requests, err :=
ssh.NewClientConn(conn, sshAddr, config)
if err != nil {
conn.Close()
return nil, err
}
return ssh.NewClient(transport, channels, requests), nil
}I nomi dei pacchetti qui sono golang.org/x/net/proxy e golang.org/x/crypto/ssh. proxyAddr identifica il listener SOCKS; sshAddr identifica il server finale come host:port.
Fornisci in config l'utente SSH abituale dell'applicazione, i metodi di autenticazione e HostKeyCallback. Il pacchetto knownhosts può costruire quel callback da un file known_hosts attendibile. Passa il nome host di destinazione a NewClientConn così che il confronto della chiave host usi l'identità SSH prevista.
L'argomento nil non seleziona credenziali SOCKS. Per destinazioni SSH pubbliche consentite, una voce senza account dal elenco di proxy SOCKS5 può fornire proxyAddr se consente l'host e la porta SSH reali. Quando serve, passa un proxy.Auth con l'account del proxy; l'autenticazione SSH resta in config.
NewClient riceve i flussi in ingresso di canali e richieste restituiti da NewClientConn e gestisce quella meccanica del client. Chiudi il client SSH restituito quando il suo lavoro termina. La gestione delle connessioni in produzione richiede anche una composizione limitata e una politica di stretta di mano; questa funzione di supporto illustra solo la consegna del trasporto.