Předejte SSH klientu v Go spojení otevřené přes SOCKS
Připojte se k SSH cíli pomocí x/net/proxy a poté inicializujte x/crypto/ssh na výsledném net.Conn.
Dialer SOCKS zajišťuje transport; balíček SSH nad ním provádí SSH handshake. Volání ssh.Dial by poté vytvořilo samostatné spojení místo použití tohoto transportu.
Pomocná funkce v aplikaci, která již používá x/net/proxy a x/crypto/ssh, může vrátit nakonfigurovaného SSH klienta:
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
}Názvy balíčků jsou zde golang.org/x/net/proxy a golang.org/x/crypto/ssh. proxyAddr určuje SOCKS listener; sshAddr určuje koncový server jako host:port.
Do config předejte obvyklého SSH uživatele aplikace, metody ověřování a HostKeyCallback. Balíček knownhosts může tento callback sestavit z důvěryhodného souboru known_hosts. Předejte název cílového hostitele do NewClientConn, aby porovnání klíče hostitele použilo zamýšlenou SSH identitu.
Argument nil nevybírá žádné přihlašovací údaje SOCKS. Pro povolené veřejné SSH cíle může záznam bez účtu ze seznamu SOCKS5 proxy poskytnout proxyAddr, pokud povoluje skutečný SSH hostitel a port. Je-li třeba, předejte proxy.Auth s účtem proxy; ověřování SSH zůstává v config.
NewClient přebírá příchozí toky kanálů a požadavků vrácené NewClientConn a stará se o tuto klientskou mechaniku. Vráceného SSH klienta zavřete, až jeho práce skončí. Zpracování spojení v produkci potřebuje také omezené připojování a politiku handshake; tato pomocná funkce jen ilustruje předání transportu.