对于一个Golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《通过堡垒主机进行 SSH》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!
问题内容我刚刚开始使用 go,我正在尝试通过堡垒主机设置 ssh 连接,我成功地通过了堡垒主机的身份验证,但在 lan 主机上失败了。我读过很多帖子,我发现这个答案非常有帮助。但我不确定那个人的配置中会有什么。我的代码如下。我试图只使用公钥,如果它很重要,我会在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试图通过堡垒主机
连接到devserver01,错误为
2020/02/03 14:40:17 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]
请原谅所有需要的 printfs 来查看发生了什么。 在第二次连接中,公钥配置是否会弄乱它?我也检查过这个项目,但似乎有点矫枉过正。
解决方案
上面的代码很好,我在一个我总是连接的盒子上遇到了 authorized_keys
问题,但忘记了我本地的 .ssh/config
:(
我想对此进行一些扩展,所以这不仅仅是哎呀,我搞砸了帖子。对于 lanhost 代理连接的完整堡垒,我更新了 gist
here
本篇关于《通过堡垒主机进行 SSH》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!