首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用nc替换ProxyCommand

用nc替换ProxyCommand
EN

Stack Overflow用户
提问于 2016-11-18 02:02:34
回答 2查看 3.5K关注 0票数 2

我正计划实现一个golang版本的ssh客户端,通过一个bastion.But连接到目标服务器--不幸的是,我在替换nc代理时失败了。

在本地ssh配置中:

代码语言:javascript
复制
Host bastion
    HostName xxx.xxx.xxx.xxx
    User ec2-user
    IdentityFile ~/.ssh/xxx-bastion.pem
Host 10.0.*.*
  User ec2-user
  IdentityFile ~/.ssh/xxx-dest.pem
  ProxyCommand ssh -q bastion "nc -w 3600 %h %p"

我的golang实现如下:

代码语言:javascript
复制
var(
    Bastion="xxx.xxx.xxx.xxx:22"
    Target="xxx.xxx.xxx.xxx:22"
    BastionPem ="/Users/me/.ssh/xxx-bastion.pem"
    DestPem ="/Users/me/.ssh/xxx-dest.pem"
    Timeout=30*time.Second
)

func BastionConfig() (*ssh.ClientConfig,error){
    pemBytes, err := ioutil.ReadFile(BastionPem)
    if err != nil {
        log.Fatal(err)
    }
    signer, err := ssh.ParsePrivateKey(pemBytes)
    if err != nil {
        log.Fatalf("parse key failed:%v", err)
    }
    config := &ssh.ClientConfig{
        User: "ec2-user",
        Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
        Timeout:Timeout,
    }
    return config,err
}


func DestConfig() (*ssh.ClientConfig,error){
    pemBytes, err := ioutil.ReadFile(TargetPem)
    if err != nil {
        log.Fatal(err)
    }
    signer, err := ssh.ParsePrivateKey(pemBytes)
    if err != nil {
        log.Fatalf("parse key failed:%v", err)
    }
    config := &ssh.ClientConfig{
        User: "ec2-user",
        Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
        Timeout:Timeout,
    }
    return config,err
}
func Connect(){
    config,_:= BastionConfig()
    bClient, err := ssh.Dial("tcp", Bastion, config)
    if err != nil {
        log.Fatal("dial bastion error:",err)
    }
    log.Println("dial bastion ok...")
    // Dial a connection to the service host, from the bastion
    conn, err := bClient.Dial("tcp", Target)
    if err != nil {
        log.Fatal("dial target error",err)
    }
    targetConfig,_:= DestConfig()
    ncc, chans, reqs, err := ssh.NewClientConn(conn, Target, targetConfig)
    if err != nil {
        log.Fatal("new target conn error:",err)
    }
    log.Printf("target conn[%s] ok\n",Target)

    targetClient := ssh.NewClient(ncc, chans, reqs)
    if err != nil {
        log.Fatalf("target ssh error:%v",err)
    }

    session,err:=targetClient.NewSession()

    if err!=nil{
        log.Fatalf("session failed:%v",err)
    }
    defer session.Close()
    var stdoutBuf bytes.Buffer
    session.Stdout = &stdoutBuf
    err = session.Run("hostname")
    if err != nil {
        log.Fatalf("Run failed:%v", err)
    }
    log.Printf(">%s", stdoutBuf)

}

但是我得到了堡垒服务器的主机名,而不是我的目标服务器,我是不是漏了引导解配置服务器的输入/输出,我不知道我的代码哪里出了问题,谁能告诉我一些方向吗?

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-19 09:48:21

我发现我的代码是对的。以前,我在本地被pem文件搞糊涂了。在我的服务器配置中,bastion和dest服务器,pem目前是相当different.so的,代码现在还可以。我可以通过使用golang登录到目标服务器来执行命令。

票数 1
EN

Stack Overflow用户

发布于 2017-03-21 07:18:40

试试这个包https://github.com/appleboy/easyssh-proxy

代码语言:javascript
复制
ssh := &easyssh.MakeConfig{
    User:    "drone-scp",
    Server:  "localhost",
    Port:    "22",
    KeyPath: "./tests/.ssh/id_rsa",
    Proxy: easyssh.DefaultConfig{
        User:    "drone-scp",
        Server:  "localhost",
        Port:    "22",
        KeyPath: "./tests/.ssh/id_rsa",
    },
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40668227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档