加密/ssh ParsePublicKey“短读”错误

Geo*_* IV 4 ssh go key-pair

在我正在开发的程序中,我需要一种在开发过程中将公钥添加到 authorized_keys 文件的方法,因此我使用命令行参数来执行此操作。

我省略了大部分代码,但如果您想查看所有代码,这里是存储库,问题行位于 main.go 的第 20 行。

b, err := ioutil.ReadFile(os.Args[1])
if err != nil {
    log.Fatalf("Fatal error trying to read new public key file: %s", err)
}

newAuthorizedKey, err := ssh.ParsePublicKey(b)
if err != nil {
    log.Fatalf("Fatal error trying to parse new public key: %s", err)
}
Run Code Online (Sandbox Code Playgroud)

“短读”错误来自ssh.ParsePublicKey函数。我传入的命令行参数是要添加到该程序的authorized_keys 文件中的公钥的位置(例如~/.ssh/id_rsa.pub)。我已确保文件正确传递到程序中。

我查看了源代码,希望能调试这个“短读”错误,但我不知道发生了什么。ParsePublicKey函数源代码的位置crypto/ssh位于此处parseString函数源代码的位置,即ParsePublicKey函数用于生成“短读”错误的源代码位置,位于此处,也在crypto/ssh.

roy*_*ter 8

我认为该问题的一些评论导致了这一点,但该函数ssh.ParseAuthorizedKey([]byte)能够读取~/.ssh/id_rsa.pub.

https://godoc.org/golang.org/x/crypto/ssh#ParseAuthorizedKey

你的例子应该是这样的:

b, err := ioutil.ReadFile(os.Args[1])
if err != nil {
    log.Fatalf("Fatal error trying to read new public key file: %s", err)
}

newAuthorizedKey, _, _, _, err := ssh.ParseAuthorizedKey(b)
if err != nil {
    log.Fatalf("Fatal error trying to parse new public key: %s", err)
}
Run Code Online (Sandbox Code Playgroud)