Przekaż klientowi SSH w Go połączenie otwarte przez SOCKS
Połącz się z celem SSH przez x/net/proxy, a następnie zainicjuj x/crypto/ssh na uzyskanym net.Conn.
Dialer SOCKS dostarcza transport; pakiet SSH wykonuje nad nim uścisk dłoni SSH. Wywołanie ssh.Dial później utworzyłoby osobne połączenie zamiast użyć tego transportu.
Funkcja pomocnicza w aplikacji, która już używa x/net/proxy i x/crypto/ssh, może zwrócić skonfigurowanego klienta SSH:
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
}Nazwy pakietów to tutaj golang.org/x/net/proxy i golang.org/x/crypto/ssh. proxyAddr wskazuje nasłuchiwacz SOCKS; sshAddr wskazuje serwer końcowy jako host:port.
W config podaj zwykłego użytkownika SSH aplikacji, metody uwierzytelniania i HostKeyCallback. Pakiet knownhosts może zbudować ten callback z zaufanego pliku known_hosts. Przekaż nazwę hosta docelowego do NewClientConn, aby dopasowanie klucza hosta używało zamierzonej tożsamości SSH.
Argument nil nie wybiera żadnych danych logowania SOCKS. Dla dozwolonych publicznych celów SSH wpis bez konta z listy proxy SOCKS5 może dostarczyć proxyAddr, jeśli zezwala na rzeczywisty host i port SSH. Gdy trzeba, przekaż proxy.Auth z kontem proxy; uwierzytelnianie SSH pozostaje w config.
NewClient odbiera przychodzące strumienie kanałów i żądań zwracane przez NewClientConn i obsługuje ten mechanizm klienta. Zamknij zwróconego klienta SSH, gdy jego praca się skończy. Obsługa połączeń w produkcji wymaga też ograniczonego łączenia i polityki uścisku dłoni; ta funkcja pomocnicza jedynie ilustruje przekazanie transportu.