为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用socks代理连接远程ssh服务器?

如何使用socks代理连接远程ssh服务器?

Go
神不在的星期二 2021-12-27 10:51:28
package mainimport (    "errors"    "fmt"    "net"    "golang.org/x/crypto/ssh")var (    socks    string = "127.0.0.1:8000"    server   string = "192.168.1.1:2222"    cmd      string = ""    login    string = "root"    password string = "")func main() {    c, err := netConn(socks)    if err != nil {        fmt.Println(err)    }    conf := &ssh.ClientConfig{        User: login,        Auth: []ssh.AuthMethod{            ssh.Password(password),        },    }    client, err := Dialer(conf, c, server)    if err != nil {        fmt.Println(err)    }    session, err := client.NewSession()    defer session.Close()    if err != nil {        fmt.Println(err)    }    session.Run(cmd)}func netConn(addr string) (net.Conn, error) {    conn, err := net.Dial("tcp", addr)    if err != nil {        return nil, errors.New(fmt.Sprintf("Unable to connect to %v", err))    }    return conn, nil}func Dialer(conf *ssh.ClientConfig, c net.Conn, host string) (*ssh.Client, error) {    conn, chans, reqs, err := ssh.NewClientConn(c, host, conf)    if err != nil {        return nil, err    }    return ssh.NewClient(conn, chans, reqs), nil}客户恐慌ssh:握手失败:EOF恐慌:运行时错误:无效的内存地址或零指针取消引用[信号0xb代码=0x1 addr=0x0 pc=0x80f3e2d]goroutine 1 [正在运行]:恐慌(0x8201b60,0x18522030)/usr/lib/go/src/runtime/panic.go:464 +0x326golang.org/x/crypto/ssh.(*Client).NewSession(0x0, 0x1, 0x0, 0x0)/home/user/go/src/golang.org/x/crypto/ssh/client.go:129 +0xcdmain.main()/home/user/go/src/ss/i.go:34 +0x276和袜子服务器在日志中[ERR] 袜子:不支持的 SOCKS 版本:[83]我怎样才能使它成为可能?谢谢。
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

您可以x/net/proxy按如下方式使用该包:


package main


import (

    "log"


    "golang.org/x/crypto/ssh"

    "golang.org/x/net/proxy"

)


func main() {


    sshConfig := &ssh.ClientConfig{

        User: "user",

        // Auth: .... fill out with keys etc as normal

    }


    client, err := proxiedSSHClient("127.0.0.1:8000", "127.0.0.1:22", sshConfig)

    if err != nil {

        log.Fatal(err)

    }


    // get a session etc...

}


func proxiedSSHClient(proxyAddress, sshServerAddress string, sshConfig *ssh.ClientConfig) (*ssh.Client, error) {

    dialer, err := proxy.SOCKS5("tcp", proxyAddress, nil, proxy.Direct)

    if err != nil {

        return nil, err

    }


    conn, err := dialer.Dial("tcp", sshServerAddress)

    if err != nil {

        return nil, err

    }


    c, chans, reqs, err := ssh.NewClientConn(conn, sshServerAddress, sshConfig)

    if err != nil {

        return nil, err

    }


    return ssh.NewClient(c, chans, reqs), nil

}


查看完整回答
反对 回复 2021-12-27
?
HUH函数

TA贡献1836条经验 获得超4个赞

从ssh包API可以看出,函数


func Dial(network, addr string, config *ClientConfig) (*Client, error)

直接返回 ssh.Client 类型的对象。因此,您可以通过以下方式缩短大量代码:


func main() {

    conf := &ssh.ClientConfig{

            User: login,

            Auth: []ssh.AuthMethod{

                    ssh.Password(password),

            },

    }

    client, err := ssh.Dial("tcp", server, conf)

    if err != nil {

            fmt.Println(err)

    }

    defer client.Close()


    session, err := client.NewSession()

    defer session.Close()

    if err != nil {

            fmt.Println(err)

    }

    session.Run(cmd)

}

希望这可以帮助 !


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信