SOCKS తెరిచిన కనెక్షన్ను Go యొక్క SSH క్లయింట్కు ఇవ్వండి
x/net/proxyతో SSH గమ్యానికి డయల్ చేయండి, తర్వాత వచ్చిన net.Connపై x/crypto/ssh ప్రారంభించండి.
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 క్లయింట్ను మూసివేయండి. ఉత్పత్తిలో కనెక్షన్ నిర్వహణకు పరిమిత డయలింగ్ మరియు హ్యాండ్షేక్ విధానం కూడా అవసరం; ఈ సహాయక ఫంక్షన్ రవాణా అప్పగింపును మాత్రమే చూపిస్తుంది.