Dialer SOCKS menyediakan transport; paket SSH melakukan jabat tangan SSH di atasnya. Memanggil ssh.Dial sesudahnya akan membuat koneksi terpisah alih-alih memakai transport itu.

Fungsi pembantu pada aplikasi yang sudah memakai x/net/proxy dan x/crypto/ssh dapat mengembalikan klien SSH yang telah dikonfigurasi:

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
}

Nama paket di sini adalah golang.org/x/net/proxy dan golang.org/x/crypto/ssh. proxyAddr menandai pendengar SOCKS; sshAddr menandai server akhir sebagai host:port.

Berikan di config pengguna SSH biasa aplikasi, metode autentikasi, dan HostKeyCallback. Paket knownhosts dapat membangun callback itu dari berkas known_hosts yang tepercaya. Teruskan nama host tujuan ke NewClientConn agar pencocokan kunci host memakai identitas SSH yang dimaksud.

Argumen nil tidak memilih kredensial SOCKS. Untuk tujuan SSH publik yang diizinkan, entri tanpa akun dari daftar proxy SOCKS5 dapat menyediakan proxyAddr jika mengizinkan host dan port SSH sebenarnya. Bila perlu, teruskan proxy.Auth berisi akun proxy; autentikasi SSH tetap di config.

NewClient menerima aliran kanal dan permintaan masuk yang dikembalikan NewClientConn dan menangani mekanisme klien tersebut. Tutup klien SSH yang dikembalikan saat pekerjaannya selesai. Penanganan koneksi di produksi juga memerlukan dialing terbatas dan kebijakan jabat tangan; fungsi pembantu ini hanya menggambarkan penyerahan transport.

Artikel terkait