O dialer de SOCKS fornece o transporte; o paquete SSH fai o apretón de mans SSH sobre el. Chamar despois a ssh.Dial crearía unha conexión separada en vez de usar ese transporte.

Unha función auxiliar nunha aplicación que xa usa x/net/proxy e x/crypto/ssh pode devolver o cliente SSH configurado:

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
}

Os nomes dos paquetes aquí son golang.org/x/net/proxy e golang.org/x/crypto/ssh. proxyAddr identifica o oínte SOCKS; sshAddr identifica o servidor final como host:port.

Fornece en config o usuario SSH habitual da aplicación, os métodos de autenticación e HostKeyCallback. O paquete knownhosts pode construír ese callback a partir dun ficheiro known_hosts de confianza. Pasa o nome de host de destino a NewClientConn para que a comprobación da clave de host use a identidade SSH prevista.

O argumento nil non selecciona credenciais SOCKS. Para destinos SSH públicos permitidos, unha entrada sen conta da lista de proxies SOCKS5 pode fornecer proxyAddr se permite o host e o porto SSH reais. Cando faga falta, pasa un proxy.Auth coa conta do proxy; a autenticación SSH segue en config.

NewClient recibe os fluxos entrantes de canles e peticións que devolve NewClientConn e encárgase desa maquinaria do cliente. Pecha o cliente SSH devolto cando remate o seu traballo. A xestión de conexións en produción tamén precisa marcado limitado e política de apretón de mans; esta función auxiliar só ilustra a entrega do transporte.

Artigos relacionados