Дыялер SOCKS забяспечвае транспарт; пакет SSH выконвае SSH-рукапоціск праз яго. Выклік ssh.Dial пасля гэтага стварыў бы асобнае злучэнне замест выкарыстання гэтага транспарту.

Дапаможная функцыя ў праграме, якая ўжо выкарыстоўвае x/net/proxy і x/crypto/ssh, можа вярнуць наладжаны 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
}

Назвы пакетаў тут — golang.org/x/net/proxy і golang.org/x/crypto/ssh. proxyAddr пазначае слухач SOCKS; sshAddr пазначае канцавы сервер у выглядзе host:port.

Перадайце ў config звычайнага карыстальніка SSH праграмы, метады аўтэнтыфікацыі і HostKeyCallback. Пакет knownhosts можа пабудаваць гэты callback з даверанага файла known_hosts. Перадайце імя хоста прызначэння ў NewClientConn, каб супастаўленне ключа хоста выкарыстоўвала патрэбную ідэнтычнасць SSH.

Аргумент nil не выбірае ніякіх уліковых даных SOCKS. Для дазволеных публічных SSH-прызначэнняў запіс без уліковага запісу з спісу SOCKS5-проксі можа даць proxyAddr, калі ён дазваляе фактычны хост і порт SSH. Калі трэба, перадайце proxy.Auth з уліковым запісам проксі; аўтэнтыфікацыя SSH застаецца ў config.

NewClient атрымлівае ўваходныя патокі каналаў і запытаў, вернутыя NewClientConn, і кіруе гэтым механізмам кліента. Закрывайце вернуты SSH-кліент пасля завяршэння працы. Апрацоўка злучэнняў у рэальнай эксплуатацыі таксама патрабуе абмежаванага дыялеру і палітыкі рукапоціску; гэтая дапаможная функцыя толькі паказвае перадачу транспарту.

Падобныя артыкулы