מסרו ללקוח ה-SSH של Go את החיבור שנפתח ב-SOCKS
חייגו ליעד ה-SSH עם x/net/proxy, ואז אתחלו את x/crypto/ssh על ה-net.Conn שנוצר.
ה-dialer של 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 המוחזר כשהעבודה שלו נגמרת. טיפול בחיבורים בייצור דורש גם חיוג מוגבל בזמן ומדיניות לחיצת יד; פונקציית העזר הזו רק ממחישה את מסירת התעבורה.