猿问

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

package main


import (

    "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 +0x326


golang.org/x/crypto/ssh.(*Client).NewSession(0x0, 0x1, 0x0, 0x0)


/home/user/go/src/golang.org/x/crypto/ssh/client.go:129 +0xcd


main.main()


/home/user/go/src/ss/i.go:34 +0x276


和袜子服务器在日志中


[ERR] 袜子:不支持的 SOCKS 版本:[83]


我怎样才能使它成为可能?谢谢。


神不在的星期二
浏览 211回答 2
2回答

守候你守候我

您可以x/net/proxy按如下方式使用该包:package mainimport (    "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}

HUH函数

从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)}希望这可以帮助 !
随时随地看视频慕课网APP

相关分类

Go
我要回答