Dați clientului SSH din Go conexiunea deschisă de SOCKS
Conectați-vă la destinația SSH cu x/net/proxy, apoi inițializați x/crypto/ssh pe net.Conn rezultat.
Dialerul SOCKS asigură transportul; pachetul SSH face strângerea de mână SSH peste el. Un apel ssh.Dial după aceea ar crea o conexiune separată în loc să folosească acel transport.
O funcție ajutătoare într-o aplicație care folosește deja x/net/proxy și x/crypto/ssh poate returna clientul SSH configurat:
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
}Numele pachetelor aici sunt golang.org/x/net/proxy și golang.org/x/crypto/ssh. proxyAddr identifică ascultătorul SOCKS; sshAddr identifică serverul final ca host:port.
Furnizați în config utilizatorul SSH obișnuit al aplicației, metodele de autentificare și HostKeyCallback. Pachetul knownhosts poate construi acel callback dintr-un fișier known_hosts de încredere. Treceți numele gazdei destinației la NewClientConn, astfel încât potrivirea cheii de gazdă să folosească identitatea SSH dorită.
Argumentul nil nu selectează acreditive SOCKS. Pentru destinații SSH publice permise, o intrare fără cont din lista de proxy SOCKS5 poate furniza proxyAddr dacă permite gazda și portul SSH reale. Când e nevoie, treceți un proxy.Auth cu contul de proxy; autentificarea SSH rămâne în config.
NewClient primește fluxurile de canale și cereri primite returnate de NewClientConn și se ocupă de mecanica respectivă a clientului. Închideți clientul SSH returnat când lucrul lui se termină. Gestionarea conexiunilor în producție are nevoie și de conectare limitată și de o politică de strângere de mână; această funcție ajutătoare doar ilustrează predarea transportului.