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

时间:2016-03-10 03:23:53

标签: go ssh

我想实现这种情况: 在AWS上,我有一个VPC,它部署了一个公共和私有子网。在公共子网中,我有一个"堡垒"例如,在私有子网中,有一个节点运行某些服务(AKA"服务实例")。 通过使用* nux ssh命令,我可以做这样的事情来连接到"服务实例"来自我当地的笔记本电脑:

.and()

我有一个Go程序,想要做以下事情:

  
      
  1. ssh连接到"服务实例"来自"本地笔记本电脑"在"堡垒"
  2.   
  3. 使用连接会话运行一些命令(例如" ls -l")
  4.   
  5. 从本地笔记本电脑上传文件"到"服务实例"
  6.   

我已经尝试但无法实现与执行

相同的过程
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 个答案:

答案 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.