我本地有个 git 仓库,remote 地址是 ssh 形式([email protected]: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
[email protected]: 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 [email protected]
Load key "/c/Users/Username/.ssh/id_rsa": invalid format
[email protected]: Permission denied (publickey).
但在 cmd (非管理员权限)中正常
Microsoft Windows [版本 10.0.19045.2965]
(c) Microsoft Corporation 。保留所有权利。
C:\Users\Username>ssh -T [email protected]
Hi Username! You've successfully authenticated, but GitHub does not provide shell access.
直接就是一个白丝不得其解,VSCode 里面也没办法正常推送,感觉是权限问题,但是权限上看着又没啥问题,想问问大家有没有什么头绪,先谢过了。
1
ManUnDead 2023-07-17 23:59:38 +08:00 via Android
是不是本地.ssh 目录里存放的公钥有问题,我记着之前踩过的一个坑是本地居然会对 pub 公钥和私钥进行校验
|
2
hsfzxjy 2023-07-18 01:10:21 +08:00
你看这里有没有中的 https://serverfault.com/questions/854208/ssh-suddenly-returning-invalid-format
另外,“白丝不得其解” 🤣🤣🤣 |
4
forcecharlie 2023-07-18 10:22:23 +08:00
你这个问题可能的解决方案有两种:
第一种看文件的属性,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 )的并不一致。 这里我也只是做个推测,并没有验证。 |
5
xiri 2023-07-18 10:36:52 +08:00 via Android
建议检查一下你的 id_rsa 文件中的换行符,如果是 CRLF (\r\n )换行就会出现 cmd 正常( windows 自带的 ssh )但是 git bash 出现 invalid format 的情况
|
6
LxnChan OP @forcecharlie @xiri
刚看了一下确实是公私钥都是 CRLF ,刚才也解决了 那么我是怎么解决的呢? 我在 git 官网上重新下载了 Windows 版的 Git ,寻思死马当活马医,在中间有一步选 OpenSSH 库,要求选内置还是 Windows 自带,我选了 Windows 自带,于是就能正常提交了。 现在看来应该就是换行符的问题,总之谢谢了 |