Տվեք Go-ի SSH հաճախորդին SOCKS-ով բացված կապը
Միացեք SSH նպատակակետին x/net/proxy-ով, ապա աշխատեցրեք x/crypto/ssh-ը ստացված net.Conn-ի վրա։
SOCKS dialer-ը տրամադրում է տրանսպորտը, իսկ 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 հաճախորդը, երբ աշխատանքն ավարտվի։ Արտադրությունում կապերի մշակումը նաև պահանջում է սահմանափակ միացում և ձեռքսեղմման քաղաքականություն. այս օժանդակ ֆունկցիան միայն ցույց է տալիս տրանսպորտի փոխանցումը։