SOCKS-dialeren leverer transporten; SSH-pakken udfører SSH-håndtrykket over den. Et kald til ssh.Dial bagefter ville skabe en separat forbindelse i stedet for at bruge den transport.

En hjælpefunktion i et program, der allerede bruger x/net/proxy og x/crypto/ssh, kan returnere den konfigurerede SSH-klient:

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
}

Pakkenavnene her er golang.org/x/net/proxy og golang.org/x/crypto/ssh. proxyAddr angiver SOCKS-lytteren; sshAddr angiver den endelige server som host:port.

Angiv i config programmets sædvanlige SSH-bruger, godkendelsesmetoder og HostKeyCallback. Pakken knownhosts kan bygge det callback ud fra en betroet known_hosts-fil. Send destinationsværtsnavnet til NewClientConn, så værtsnøgleafstemningen bruger den tilsigtede SSH-identitet.

Argumentet nil vælger ingen SOCKS-legitimationsoplysninger. For tilladte offentlige SSH-destinationer kan en konto uden login fra SOCKS5-proxylisten levere proxyAddr, hvis den tillader den faktiske SSH-vært og -port. Når det kræves, sendes en proxy.Auth med proxykontoen; SSH-godkendelsen bliver i config.

NewClient modtager de indgående kanal- og anmodningsstrømme, som NewClientConn returnerer, og håndterer den klientmekanik. Luk den returnerede SSH-klient, når dens arbejde er slut. Forbindelseshåndtering i produktion kræver også en afgrænset dialing og håndtrykspolitik; denne hjælpefunktion illustrerer kun transportoverdragelsen.

Relaterede artikler