go - 通过堡垒主机 SSH
问题描述
我刚刚开始使用 Go,我正在尝试通过堡垒主机设置 ssh 连接,我成功地通过了堡垒主机的身份验证,但在 LAN 主机上失败了。我已经阅读了许多帖子,我发现这个答案非常有帮助。但我不确定那个人的配置会是什么。我的代码如下。我正在尝试仅使用 PublicKeys,如果它很重要,我从 Mac 上开始,对 linux 进行身份验证,然后无法与另一台 linux 主机建立第二次连接。普通的 ssh 工作正常
package main
import (
"fmt"
"golang.org/x/crypto/ssh"
"io/ioutil"
"log"
"os/user"
)
const TCP = "tcp"
const PORT = "22"
func bastionConnect(bastion string, localh string) *ssh.Client {
var usr, _ = user.Current()
var homeDir = usr.HomeDir
fmt.Printf("home is %v\n", homeDir)
key, err := ioutil.ReadFile(homeDir + "/.ssh/id_rsa")
if err != nil {
fmt.Print("i'm dying at reading ssh key")
panic(err)
}
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
fmt.Print("i'm dying at parsing private key")
panic(err)
}
fmt.Printf("I'm returning public keys for %v", signer.PublicKey())
config := &ssh.ClientConfig{
User: usr.Username,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Auth: []ssh.AuthMethod{
ssh.PublicKeys(signer),
},
}
bClient, err := ssh.Dial(TCP, bastion+":22", config)
if err != nil {
log.Fatal(err)
}
fmt.Print("passed bastion host\n")
// Dial a connection to the service host, from the bastion
conn, err := bClient.Dial(TCP, fmt.Sprintf("%s:%s", localh, PORT))
if err != nil {
log.Fatal(err)
}
ncc, chans, reqs, err := ssh.NewClientConn(conn, fmt.Sprintf("%s:%s", localh, PORT), config)
if err != nil {
fmt.Printf("Error trying to conntect to %s via bastion host\n%v\n", localh, err)
log.Fatal(err)
}
sClient := ssh.NewClient(ncc, chans, reqs)
return sClient
}
func main() {
var bastion = "jumpdev.example.org"
var lanHost = "devserver01"
bastionConnect(bastion, lanHost)
}
我看到的最后一个日志行是Error trying to connect to devserver01 via bastion host
错误的
2020/02/03 14:40:17 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]
请原谅所有需要查看情况的 Printfs。在第二次连接中,公钥配置是否会搞砸?我也检查了这个项目,但似乎有点矫枉过正。
解决方案
上面的代码很好,我authorized_keys
在一个我总是连接的盒子上遇到了一个问题,但忘记了我的本地.ssh/config
:(
我想对此进行一些扩展,所以不仅仅是哎呀,我把帖子搞砸了。对于 lanhost 代理连接的完整堡垒,我在gist
这里更新了
推荐阅读
- excel - 是否有一个 EXCEL 公式可以检测某个值何时/在哪个点出现在一行数据中?
- python - 如何从 matplotlib 中清除内存 - pyplot
- javascript - 图片宽度不调整宽度:100%
- javascript - JSFiddle 和本地 JS 文件的区别?
- html - 缩小页面时,DIV 正在从其位置移动
- r - 在列表中选择大于特定数字的元素
- java - 编辑文本删除文本上的单词已更改
- java - 我想在 RecyclerView 上实时更改数据
- apex - 仅从 Lwc 调用 Apex 类将被保存
- ios - AppDelegate 中的 didReceiveRemoteNotification 未调用带有通知服务扩展的静默推送通知