求问一下 git 提交时报错 invalid format 怎么解

296 天前
 LxnChan

我本地有个 git 仓库,remote 地址是 ssh 形式(git@github.com:xxx/xxx.git),采用密钥对的方式登录。

近两天重做了系统,之前的 Key (C:\Users\Username\.ssh整个文件夹)都被存放在了一个很安全的存储设备里面。重做系统后把之前备份的密钥对还原到了上述路径,之后登录业务主机没有影响。

但是今天改了点代码,想到好多天没上传了,寻思 Push 一下,结果报错:

Username@ComputerName MINGW64 /d/projectA (main)
$ git push -u origin main
Load key "/c/Users/Username/.ssh/id_rsa": invalid format
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

还以为是 Key 的问题,但是测试了 Key 是能打印出来的

Username@ComputerName MINGW64 /d/projectA (main)
$ cat /c/Users/Username/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
 [正确的 Key 内容] 
-----END OPENSSH PRIVATE KEY-----

测试在 git bash 中不通过

Username@ComputerName MINGW64 /d/projectA (main)
$ ssh -T git@github.com
Load key "/c/Users/Username/.ssh/id_rsa": invalid format
git@github.com: Permission denied (publickey).

但在 cmd (非管理员权限)中正常

Microsoft Windows [版本 10.0.19045.2965]
(c) Microsoft Corporation 。保留所有权利。

C:\Users\Username>ssh -T git@github.com
Hi Username! You've successfully authenticated, but GitHub does not provide shell access.

直接就是一个白丝不得其解,VSCode 里面也没办法正常推送,感觉是权限问题,但是权限上看着又没啥问题,想问问大家有没有什么头绪,先谢过了。

674 次点击
所在节点    问与答
6 条回复
ManUnDead
296 天前
是不是本地.ssh 目录里存放的公钥有问题,我记着之前踩过的一个坑是本地居然会对 pub 公钥和私钥进行校验
hsfzxjy
296 天前
你看这里有没有中的 https://serverfault.com/questions/854208/ssh-suddenly-returning-invalid-format

另外,“白丝不得其解” 🤣🤣🤣
LxnChan
296 天前
@ManUnDead 密钥对是没问题的,能正常 ssh 登录其他主机
forcecharlie
296 天前
你这个问题可能的解决方案有两种:
第一种看文件的属性,Git for Windows ( MINGW64 )的 SSH 可能要求 SSH 私钥的 filemode 是 0600 ,你可以在 Git for Windows (MINGW64) 的 bash 中 stat /c/Users/Username/.ssh/id_rsa ,如果不正确,则使用 chmod 0600 /c/Users/Username/.ssh/id_rsa 然后重试。
第二种是看文件换行符,Git for Windows ( MINGW64 )的 SSH 需要 LF 的换行符,而 Windows 移植的 SSH 可能能处理 CRLF ,将私钥的换行符换回去就可以了。

在 cmd 中的 SSH 实际上是微软 PowerShell 团队移植的 [OpenSSH]( https://github.com/PowerShell/Win32-OpenSSH),与 Git for Windows ( MINGW64 )的并不一致。

这里我也只是做个推测,并没有验证。
xiri
296 天前
建议检查一下你的 id_rsa 文件中的换行符,如果是 CRLF (\r\n )换行就会出现 cmd 正常( windows 自带的 ssh )但是 git bash 出现 invalid format 的情况
LxnChan
296 天前
@forcecharlie @xiri
刚看了一下确实是公私钥都是 CRLF ,刚才也解决了
那么我是怎么解决的呢?
我在 git 官网上重新下载了 Windows 版的 Git ,寻思死马当活马医,在中间有一步选 OpenSSH 库,要求选内置还是 Windows 自带,我选了 Windows 自带,于是就能正常提交了。
现在看来应该就是换行符的问题,总之谢谢了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/957563

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX