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.

Powiązane artykuły