Диалерът на 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 клиент, когато работата му приключи. Обработката на връзки в продукция също изисква ограничено свързване и политика за ръкостискане; тази помощна функция само илюстрира предаването на транспорта.

Подобни статии