ไดอาเลอร์ SOCKS จัดหาการรับส่ง ส่วนแพ็กเกจ SSH ทำการจับมือ SSH บนการรับส่งนั้น การเรียก ssh.Dial ภายหลังจะสร้างการเชื่อมต่อแยกต่างหากแทนที่จะใช้การรับส่งนั้น

ฟังก์ชันช่วยในแอปพลิเคชันที่ใช้ x/net/proxy และ x/crypto/ssh อยู่แล้วสามารถคืนค่า SSH client ที่กำหนดค่าไว้ได้:

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

ระบุผู้ใช้ SSH ตามปกติของแอปพลิเคชัน วิธีการยืนยันตัวตน และ HostKeyCallback ใน config แพ็กเกจ knownhosts สร้าง callback นั้นจากไฟล์ known_hosts ที่เชื่อถือได้ ส่งชื่อโฮสต์ปลายทางไปยัง NewClientConn เพื่อให้การจับคู่คีย์โฮสต์ใช้ตัวตน SSH ที่ตั้งใจไว้

อาร์กิวเมนต์ nil ไม่เลือกข้อมูลรับรอง SOCKS ใด ๆ สำหรับปลายทาง SSH สาธารณะที่อนุญาต รายการที่ไม่มีบัญชีจากรายการพร็อกซี SOCKS5สามารถให้ proxyAddr ได้หากอนุญาตโฮสต์และพอร์ต SSH จริง เมื่อจำเป็น ให้ส่ง proxy.Auth ที่มีบัญชีพร็อกซี การยืนยันตัวตน SSH ยังอยู่ใน config

NewClient รับสตรีมช่องทางและคำขอขาเข้าที่ NewClientConn คืนมา และจัดการกลไกไคลเอนต์นั้น ปิด SSH client ที่คืนมาเมื่องานเสร็จ การจัดการการเชื่อมต่อในระบบจริงยังต้องมีการ dial แบบจำกัดเวลาและนโยบายการจับมือ ฟังก์ชันช่วยนี้เพียงแสดงการส่งต่อการรับส่งเท่านั้น

บทความที่เกี่ยวข้อง