Ge Go:s SSH-klient den anslutning som SOCKS har öppnat
Anslut till SSH-målet med x/net/proxy och initiera sedan x/crypto/ssh på den resulterande net.Conn.
SOCKS-dialern tillhandahåller transporten; SSH-paketet utför SSH-handskakningen över den. Att anropa ssh.Dial efteråt skulle skapa en separat anslutning i stället för att använda den transporten.
En hjälpfunktion i ett program som redan använder x/net/proxy och x/crypto/ssh kan returnera den konfigurerade SSH-klienten:
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
}Paketnamnen här är golang.org/x/net/proxy och golang.org/x/crypto/ssh. proxyAddr anger SOCKS-lyssnaren; sshAddr anger den slutliga servern som host:port.
Ange i config programmets vanliga SSH-användare, autentiseringsmetoder och HostKeyCallback. Paketet knownhosts kan bygga den callbacken från en betrodd known_hosts-fil. Skicka målvärdens namn till NewClientConn så att värdnyckelmatchningen använder den avsedda SSH-identiteten.
Argumentet nil väljer inga SOCKS-uppgifter. För tillåtna offentliga SSH-mål kan en post utan konto från SOCKS5-proxylistan tillhandahålla proxyAddr om den tillåter den faktiska SSH-värden och porten. Skicka vid behov en proxy.Auth med proxykontot; SSH-autentiseringen stannar i config.
NewClient tar emot de inkommande kanal- och förfrågningsströmmarna som NewClientConn returnerar och hanterar den klientmekaniken. Stäng den returnerade SSH-klienten när arbetet är slut. Anslutningshantering i produktion kräver också begränsad uppringning och handskakningspolicy; den här hjälpfunktionen illustrerar bara överlämningen av transporten.