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 کلائنٹ بند کریں۔ پروڈکشن میں کنکشن سنبھالنے کے لیے محدود ڈائلنگ اور ہینڈ شیک پالیسی بھی درکار ہے؛ یہ مددگار فنکشن صرف نقل وحمل کی حوالگی دکھاتا ہے۔

متعلقہ مضامین