我想实现这种情况: 在AWS上,我有一个VPC,它部署了一个公共和私有子网。在公共子网中,我有一个"堡垒"例如,在私有子网中,有一个节点运行某些服务(AKA"服务实例")。 通过使用* nux ssh命令,我可以做这样的事情来连接到"服务实例"来自我当地的笔记本电脑:
.and()
我有一个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,这意味着它肯定能够做到这一点,对吗?答案 0 :(得分:10)
您可以使用&#34; x / crypto / ssh&#34;更直接地执行此操作。没有nc
命令,因为有一种方法可以从远程主机拨打连接并将其显示为net.Conn
。
获得ssh.Client
后,您可以使用Dial
方法在您和最终主机之间获取虚拟net.Conn
。然后,您可以使用ssh.NewClientConn
将其转换为新的ssh.Conn
,并使用ssh.NewClient
ssh.Client
// 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.