Geef de SSH-client van Go de verbinding die SOCKS heeft geopend
Kies de SSH-bestemming met x/net/proxy en initialiseer daarna x/crypto/ssh op de resulterende net.Conn.
De SOCKS-dialer levert het transport; het SSH-pakket doet de SSH-handshake eroverheen. Een aanroep van ssh.Dial daarna zou een aparte verbinding maken in plaats van dat transport te gebruiken.
Een hulpfunctie in een applicatie die al x/net/proxy en x/crypto/ssh gebruikt, kan de geconfigureerde SSH-client teruggeven:
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
}De pakketnamen hier zijn golang.org/x/net/proxy en golang.org/x/crypto/ssh. proxyAddr wijst de SOCKS-listener aan; sshAddr wijst de uiteindelijke server aan als host:port.
Geef in config de gebruikelijke SSH-gebruiker van de applicatie, de authenticatiemethoden en HostKeyCallback mee. Het pakket knownhosts kan die callback opbouwen uit een vertrouwd known_hosts-bestand. Geef de hostnaam van de bestemming door aan NewClientConn zodat het vergelijken van de hostsleutel de bedoelde SSH-identiteit gebruikt.
Het argument nil selecteert geen SOCKS-inloggegevens. Voor toegestane openbare SSH-bestemmingen kan een vermelding zonder account uit de SOCKS5-proxylijst proxyAddr leveren als die de werkelijke SSH-host en -poort toestaat. Geef indien nodig een proxy.Auth met het proxyaccount mee; SSH-authenticatie blijft in config.
NewClient ontvangt de inkomende kanaal- en verzoekstromen die NewClientConn teruggeeft en beheert die clientmechaniek. Sluit de teruggegeven SSH-client wanneer het werk klaar is. Verbindingsafhandeling in productie vraagt ook om begrensd dialen en een handshakebeleid; deze hulpfunctie illustreert alleen het overdragen van het transport.