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

Go x/crypto/ssh -- 如何通过堡垒节点建立到私有实例的 ssh 连接

Go x/crypto/ssh -- 如何通过堡垒节点建立到私有实例的 ssh 连接

Go
鸿蒙传说 2021-12-20 16:33:29
我想实现这个场景:在 AWS 上,我有一个 VPC,其中部署了一个公共和私有子网。在公共子网中,我有一个“堡垒”实例,而在私有子网中,有一个节点运行一些服务(也称为“服务实例”)。通过使用 *nux ssh 命令,我可以执行以下操作以从本地笔记本电脑连接到“服务实例”:ssh -t -o ProxyCommand="ssh -i <key> ubuntu@<bastion-ip> nc %h %p" -i <key> ubuntu@<service-instance-ip>我有一个 Go 程序,想做以下几件事:ssh 从“本地笔记本电脑”通过“堡垒”连接到“服务实例”使用连接会话运行一些命令(例如“ls -l”)将文件从“本地笔记本电脑”上传到“服务实例”我已经尝试过但无法实现与执行相同的过程ssh -t -o ProxyCommand="ssh -i <key> ubuntu@<bastion-ip> nc %h %p" -i <key> ubuntu@<service-instance-ip>谁能帮我举个例子?谢谢!顺便说一句,我发现了这个: https://github.com/golang/go/issues/6223,这意味着它绝对能够做到这一点,对吧?
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

您可以在没有nc命令的情况下使用“x/crypto/ssh”更直接地执行此操作,因为有一种方法可以从远程主机拨打连接并将其显示为net.Conn.


一旦有了ssh.Client,您就可以使用该Dial方法net.Conn在您和最终主机之间建立虚拟机。然后你可以把它变成一个新的ssh.Connwith ssh.NewClientConn,并创建一个新的ssh.Clientwithssh.NewClient


// connect to the bastion host

bClient, err := ssh.Dial("tcp", bastionAddr, config)

if err != nil {

    log.Fatal(err)

}


// Dial a connection to the service host, from the bastion

conn, err := bClient.Dial("tcp", serviceAddr)

if err != nil {

    log.Fatal(err)

}


ncc, chans, reqs, err := ssh.NewClientConn(conn, serviceAddr, config)

if err != nil {

    log.Fatal(err)

}


sClient := ssh.NewClient(ncc, chans, reqs)

// sClient is an ssh client connected to the service host, through the bastion host.


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号