SOCKS çevirici taşımayı sağlar; SSH paketi el sıkışmayı onun üzerinde yapar. Sonradan ssh.Dial çağırmak, o taşımayı kullanmak yerine ayrı bir bağlantı oluşturur.

x/net/proxy ve x/crypto/ssh kullanan bir uygulamadaki yardımcı işlev, yapılandırılmış SSH istemcisini döndürebilir:

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
}

Buradaki paket adları golang.org/x/net/proxy ve golang.org/x/crypto/ssh. proxyAddr SOCKS dinleyicisini, sshAddr son sunucuyu host:port olarak belirtir.

config içinde uygulamanın olağan SSH kullanıcısını, kimlik doğrulama yöntemlerini ve HostKeyCallback'i verin. knownhosts paketi bu callback'i güvenilir bir known_hosts dosyasından oluşturabilir. Hedef ana bilgisayar adını NewClientConn'a geçirin ki anahtar eşleştirmesi amaçlanan SSH kimliğini kullansın.

nil bağımsız değişkeni herhangi bir SOCKS kimlik bilgisi seçmez. İzin verilen genel SSH hedefleri için SOCKS5 proxy listesindeki hesapsız bir kayıt, gerçek SSH ana bilgisayarına ve bağlantı noktasına izin veriyorsa proxyAddr sağlayabilir. Gerektiğinde proxy hesabını içeren bir proxy.Auth geçin; SSH kimlik doğrulaması config içinde kalır.

NewClient, NewClientConn'un döndürdüğü gelen kanal ve istek akışlarını alır ve bu istemci mekanizmasını yönetir. İşi bitince döndürülen SSH istemcisini kapatın. Üretimde bağlantı yönetimi ayrıca sınırlı çevirme ve el sıkışma ilkesi gerektirir; bu yardımcı işlev yalnızca taşımanın devrini gösterir.

İlgili makaleler