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 ક્લાયન્ટ બંધ કરો. ઉત્પાદનમાં કનેક્શન સંભાળ માટે મર્યાદિત ડાયલિંગ અને હેન્ડશેક નીતિ પણ જરૂરી છે; આ સહાયક ફંક્શન ફક્ત ટ્રાન્સપોર્ટનું હસ્તાંતરણ દર્શાવે છે.

સંબંધિત લેખો