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 क्लाइंट बंद करें। उत्पादन में कनेक्शन प्रबंधन के लिए सीमित डायलिंग और हैंडशेक नीति भी चाहिए; यह सहायक फ़ंक्शन केवल ट्रांसपोर्ट का हस्तांतरण दिखाता है।

संबंधित लेख