SOCKS dialeri nəqliyyatı təmin edir; SSH paketi SSH əl sıxışmasını onun üzərində aparır. Sonradan ssh.Dial çağırmaq həmin nəqliyyatdan istifadə etmək əvəzinə ayrı bir bağlantı yaradır.

Artıq x/net/proxy və x/crypto/ssh istifadə edən tətbiqdə köməkçi funksiya konfiqurasiya edilmiş SSH müştərisini qaytara bilər:

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
}

Buradakı paket adları golang.org/x/net/proxy və golang.org/x/crypto/ssh-dır. proxyAddr SOCKS dinləyicisini, sshAddr isə son serveri host:port kimi müəyyən edir.

config daxilində tətbiqin adi SSH istifadəçisini, autentifikasiya üsullarını və HostKeyCallback-i verin. knownhosts paketi həmin callback-i etibarlı known_hosts faylından qura bilər. Hədəf host adını NewClientConn-a ötürün ki, host açarının uyğunlaşdırılması nəzərdə tutulan SSH kimliyindən istifadə etsin.

nil arqumenti heç bir SOCKS etimadnaməsi seçmir. İcazə verilən ictimai SSH hədəfləri üçün SOCKS5 proksi siyahısındakı hesabsız giriş, faktiki SSH hostuna və portuna icazə verirsə, proxyAddr təmin edə bilər. Lazım olduqda proksi hesabını daşıyan proxy.Auth ötürün; SSH autentifikasiyası config-də qalır.

NewClient NewClientConn-un qaytardığı daxil olan kanal və sorğu axınlarını qəbul edib həmin müştəri mexanizmini idarə edir. İşi bitdikdə qaytarılan SSH müştərisini bağlayın. İstehsalatda bağlantı idarəsi həm də məhdud dialinq və əl sıxışması siyasəti tələb edir; bu köməkçi yalnız nəqliyyatın təhvilini göstərir.

Əlaqəli məqalələr