golang ssh 免密登陆

/ go / 没有评论 / 3363浏览

golang ssh 免密登陆

golang 配置ssh无密码登录,找到一个办法是需要SSH_AUTH_SOCK,然后使用如下代码连接

func SSHClient(hostport string, username string) (*ssh.Client, error) {
    sock, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK"))
    if err != nil {
        logrus.Infof("error login,details: %s",err.Error())
        return nil,err
    }

    agent := agent.NewClient(sock)

    signers, err := agent.Signers()
    if err != nil {
        logrus.Infof("error login,details: %s",err.Error())
        return nil,err
    }

    auths := []ssh.AuthMethod{ssh.PublicKeys(signers...)}

    cfg := &ssh.ClientConfig{
        User: username,
        Auth: auths,
        HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
            return nil
        },
    }
    cfg.SetDefaults()
    logrus.Infof("tcp dial to %s",hostport)
    client, err := ssh.Dial("tcp", hostport, cfg)
    if err != nil {
        logrus.Infof("error login,details: %s",err.Error())
        return nil,err
    }
    return client, nil
}

在本机 macbook可以登录测试机,在测试机(Linux)上登录不到其他测试机。报错:

dial unix: missing address

机器中并没有SSH_AUTH_SOCK 描述中的机器均已配置免密登陆。

回答

你的私钥是不是有密码,试着在Linux 客户端执行

ssh-agent
ssh-add ~/.ssh/id_dsa (你的私钥)