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 క్లయింట్‌ను మూసివేయండి. ఉత్పత్తిలో కనెక్షన్ నిర్వహణకు పరిమిత డయలింగ్ మరియు హ్యాండ్‌షేక్ విధానం కూడా అవసరం; ఈ సహాయక ఫంక్షన్ రవాణా అప్పగింపును మాత్రమే చూపిస్తుంది.

సంబంధిత వ్యాసాలు