【问题标题】:Go x/crypto/ssh -- How to establish ssh connection to private instance over a bastion nodeGo x/crypto/ssh -- 如何通过堡垒节点建立到私有实例的 ssh 连接
【发布时间】:2016-03-10 03:23:52
【问题描述】:

我想实现这个场景: 在 AWS 上,我有一个 VPC,其中部署了一个公有和私有子网。在公共子网中,我有一个“堡垒”实例,而在私有子网中,有一个节点运行一些服务(又名“服务实例”)。 通过使用 *nux ssh 命令,我可以执行以下操作从本地笔记本电脑连接到“服务实例”:

ssh -t -o ProxyCommand="ssh -i <key> ubuntu@<bastion-ip> nc %h %p" -i <key> ubuntu@<service-instance-ip>

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

  1. ssh 通过“堡垒”从“本地笔记本电脑”连接到“服务实例”
  2. 使用连接会话运行一些命令(例如“ls -l”)
  3. 将文件从“本地笔记本电脑”上传到“服务实例”

我已经尝试过,但无法实现与做相同的过程

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,也就是说它肯定能做到,对吧?

【问题讨论】:

  • 代理转发与此没有任何关系,尤其是因为您在命令行上指定了您的私钥(但您确实应该使用代理和加密密钥)

标签: go ssh


【解决方案1】:

您可以更直接地使用“x/crypto/ssh”而不使用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.

【讨论】:

  • 非常感谢!我会尝试并在这里给你反馈。
  • 非常感谢 JimB,它运行良好!
猜你喜欢
  • 2021-10-16
  • 2019-09-10
  • 2018-12-19
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2018-07-16
相关资源
最近更新 更多