سلّم عميل SSH في Go الاتصال الذي فتحه SOCKS
اتصل بوجهة SSH عبر x/net/proxy، ثم شغّل x/crypto/ssh على net.Conn الناتج.
مُوزِّع 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 المُعاد عند انتهاء عمله. تحتاج معالجة الاتصالات في الإنتاج أيضًا إلى سياسة اتصال محدودة وسياسة مصافحة؛ هذه الدالة المساعدة توضّح تسليم النقل فقط.