دیالر 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 مشخص می‌کند.

کاربر معمول SSH برنامه، روش‌های احراز هویت و HostKeyCallback را در config بدهید. بستهٔ knownhosts می‌تواند آن callback را از یک فایل known_hosts مورد اعتماد بسازد. نام میزبان مقصد را به NewClientConn بدهید تا تطبیق کلید میزبان از هویت SSH موردنظر استفاده کند.

آرگومان nil هیچ اعتبارنامهٔ SOCKS انتخاب نمی‌کند. برای مقصدهای عمومی مجاز SSH، یک ورودی بدون حساب از فهرست پروکسی SOCKS5 می‌تواند proxyAddr را تأمین کند، اگر میزبان و درگاه واقعی SSH را مجاز بداند. در صورت نیاز، proxy.Auth حاوی حساب پروکسی را بدهید؛ احراز هویت SSH در config می‌ماند.

NewClient جریان‌های ورودی کانال و درخواست را که NewClientConn برمی‌گرداند می‌گیرد و همان سازوکار کلاینت را اداره می‌کند. وقتی کار کلاینت SSH برگشتی تمام شد آن را ببندید. مدیریت اتصال در محیط عملیاتی به دیال کردن محدود و سیاست دست‌دادن هم نیاز دارد؛ این تابع کمکی فقط تحویل انتقال را نشان می‌دهد.

مقالات مرتبط