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“短读”错误的主要内容,如果未能解决你的问题,请参考以下文章

Go执行远程ssh命令

golang通过ssh实现远程文件传输

使用 ssh golang 包解析 ssh 密钥

发送SSH命令以配置网络设备

如何使用 Go 通过 SSH 发送终端转义序列?

Golang SSH到思科无线控制器和运行命令