crypto/ssh ParsePublicKey“短读”错误
Posted
技术标签:
【中文标题】crypto/ssh ParsePublicKey“短读”错误【英文标题】:crypto/ssh ParsePublicKey "short read" error 【发布时间】:2018-06-09 12:16:50 【问题描述】:在我正在开发的程序中,我需要一种在开发过程中将公钥添加到 authorized_keys 文件中的方法,因此我使用命令行参数来执行此操作。
我省略了大部分代码,但如果您想查看所有代码,here is the repository,问题行位于 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)
“短读”错误来自ssh.ParsePublicKey
函数。我传入的命令行参数是要添加到该程序的 authorized_keys 文件中的公钥的位置(例如~/.ssh/id_rsa.pub
)。我已经确保文件被正确地传递到程序中。
我查看了源代码,希望能调试这个“短读”错误,但我不知道发生了什么。 ParsePublicKey
函数在crypto/ssh
中的源代码位置位于here,parseString
函数的源代码位置是ParsePublicKey
函数用来生成“短读" 错误,位于here,也在crypto/ssh
。
【问题讨论】:
ParsePublicKey
的文档说它以有线格式解析公钥,而不是 openssh 使用的磁盘格式。
不知道有多种格式,有没有办法转换成有线格式? @JimB
什么都不需要解析,id_rsa.pub 是的authorized_keys格式。大多数人只需将它们直接附加到 authorized_keys 文件即可将它们添加到 cli 中。
我试图将其转换为ssh.PublicKey
接口的原因是因为MarshalAuthorizedKey
接受ssh.PublicKey
接口并返回一个授权密钥,准备好附加到authorized_keys 文件。他们是否只有此功能可以将密钥恢复为磁盘上的格式? @JimB
不,当您还没有 .pub 文件时,它们具有该功能。
【参考方案1】:
我认为这个问题的一些 cmets 导致了这个问题,但函数 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)
【讨论】:
以上是关于crypto/ssh ParsePublicKey“短读”错误的主要内容,如果未能解决你的问题,请参考以下文章