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 प्याकेजले विश्वसनीय known_hosts फाइलबाट त्यो callback बनाउन सक्छ। गन्तव्य होस्टनाम NewClientConn मा पठाउनुहोस् ताकि होस्ट-की मिलानले इच्छित SSH पहिचान प्रयोग गरोस्।

nil तर्कले कुनै SOCKS प्रमाणहरू छान्दैन। अनुमति दिइएका सार्वजनिक SSH गन्तव्यहरूका लागि SOCKS5 प्रोक्सी सूचीको खाता नभएको प्रविष्टिले proxyAddr दिन सक्छ, यदि त्यसले वास्तविक SSH होस्ट र पोर्टलाई अनुमति दिन्छ। आवश्यक परे प्रोक्सी खातासहितको proxy.Auth दिनुहोस्; SSH प्रमाणीकरण config मै रहन्छ।

NewClient ले NewClientConn ले फर्काएका आगमन च्यानल र अनुरोध स्ट्रिम लिएर त्यो क्लाइन्ट मेसिनरी सम्हाल्छ। काम सकिएपछि फर्काइएको SSH क्लाइन्ट बन्द गर्नुहोस्। उत्पादनमा जडान व्यवस्थापनका लागि सीमित डायलिङ र ह्यान्डशेक नीति पनि चाहिन्छ; यो सहायक फंक्शनले यातायातको हस्तान्तरण मात्र देखाउँछ।

सम्बन्धित लेखहरू