crypto/ssh ParsePublicKey "short read" 错误

crypto/ssh ParsePublicKey "short read" error

在我正在开发的程序中,我需要一种在开发过程中将 public 键添加到 authorized_keys 文件中的方法,因此我使用命令行参数来这样做。

我省略了大部分代码,但如果您想查看所有代码,here is the repository,问题行位于第 20 行的 main.go 中。

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)
}

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

我查看了源代码,希望能调试这个 "short read" 错误,但我无法弄清楚发生了什么。 crypto/sshParsePublicKey函数的源代码位置位于here, and the location of source code of the parseString function, which is what the ParsePublicKey function is using to generate the "short read" error, is located here,也在crypto/ssh.

我认为对问题的一些评论导致了这一点,但是函数 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)
}