SOCKS-dialern tillhandahåller transporten; SSH-paketet utför SSH-handskakningen över den. Att anropa ssh.Dial efteråt skulle skapa en separat anslutning i stället för att använda den transporten.

En hjälpfunktion i ett program som redan använder x/net/proxy och x/crypto/ssh kan returnera den konfigurerade SSH-klienten:

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
}

Paketnamnen här är golang.org/x/net/proxy och golang.org/x/crypto/ssh. proxyAddr anger SOCKS-lyssnaren; sshAddr anger den slutliga servern som host:port.

Ange i config programmets vanliga SSH-användare, autentiseringsmetoder och HostKeyCallback. Paketet knownhosts kan bygga den callbacken från en betrodd known_hosts-fil. Skicka målvärdens namn till NewClientConn så att värdnyckelmatchningen använder den avsedda SSH-identiteten.

Argumentet nil väljer inga SOCKS-uppgifter. För tillåtna offentliga SSH-mål kan en post utan konto från SOCKS5-proxylistan tillhandahålla proxyAddr om den tillåter den faktiska SSH-värden och porten. Skicka vid behov en proxy.Auth med proxykontot; SSH-autentiseringen stannar i config.

NewClient tar emot de inkommande kanal- och förfrågningsströmmarna som NewClientConn returnerar och hanterar den klientmekaniken. Stäng den returnerade SSH-klienten när arbetet är slut. Anslutningshantering i produktion kräver också begränsad uppringning och handskakningspolicy; den här hjälpfunktionen illustrerar bara överlämningen av transporten.

Relaterade artiklar