■ space · 一场重放过的谈判 · fig 1
Permission denied (publickey) = 客户端开出的每一把密钥都被拒收 ——谈判的裁决,不是密码打错了。
诊断: ssh -vvv 显示开过哪些价; journalctl -u ssh 显示为什么被拒。
然后就是四个病因之一: 用户不对、密钥不在 authorized_keys 里、权限太宽,或者 OpenSSH 8.8+ 拒收 ssh-rsa。 ssh-copy-id 能防住大多数复发。
01线缆
客户端报价 · 服务器拒收 · 三行日志决定你的问题住在哪一侧
$ ssh -vvv deploy@staging 2>&1 | grep -iE "offering|identity|denied|authentications"
debug1: Offering public key: /home/deploy/.ssh/id_rsa RSA SHA256:9T4xQmV…
02:10:03 — 拒收。部署死在 SSH-RSA 上02:14:41 — 同一个客户端,换 ed25519 通过
开价 id_rsa → 拒收 · 开价 id_ed25519 → 通过 · 台账 1R · 1A
传送带就是开价清单——钥匙串盖的每一个章, ssh -vvv 都会打印成一行
02见证
钥匙串自己记账——服务器早就记了它的第一笔:journalctl 已经把每个裁决都写进日志
Oct 18 02:10:03 staging sshd[4421]: Failed publickey for deploy from 203.0.113.7 port 51422 ssh2: RSA SHA256:9T4xQmV…
Oct 18 02:14:41 staging sshd[4421]: Accepted publickey for deploy from 203.0.113.7 port 51422 ssh2: ED25519 SHA256:KP7wLn…
两行日志,一条弧线:02:10 RSA 开价被拒——部署之死——然后还是那个客户端,四分钟后拿着 ed25519 通行
journalctl -u ssh -n 50 --no-pager | grep -iE "publickey|denied|accepted"
验证: journalctl -u ssh -n 50 | grep Accepted → 一行带着你的指纹和用户名
03病因表
日志只写裁决,从不写病因——六种形状产出同一个拒收
| 病因 | 破绽 | 修法 |
|---|---|---|
| 正确的钥匙在,来的却不对 | -vvv 开出一把你认不出的身份 | ssh-add -l 列清单, ssh-add -d 扔掉把过期的 |
-i mykey 被无视 | config 里的 IdentityFile 压过开价顺序 | 去修或删掉 ~/.ssh/config |
| 钥匙没装 | 服务器日志每次都写 Failed publickey ——authorized_keys:空的,0 把钥匙 | ssh-copy-id user@host |
| 用户不对 | 钥匙对 root@host 好使,对 deploy@host | 钥匙必须放进那个用户的 ~/.ssh/authorized_keys |
| 权限太宽 | WARNING: UNPROTECTED PRIVATE KEY FILE ——钥匙被直接跳过,根本不会开价 | chmod 700 ~/.ssh; chmod 600 ~/.ssh/* |
| 传家宝 ssh-rsa 钥匙 | 服务器跑 OpenSSH 8.8+;老 RSA 钥匙永远不被接受 | 换 ed25519 重新生成,或者升级钥匙 |
每一行都能在传送带上重放——按下它对应的按钮,看谈判挑出那个病因
ssh -o BatchMode=yes … 'echo ok' ——没有提示符,没有指望,只有 ok。04权限闸口
表里每个病因都到过服务器——这一种死在线缆的客户端一侧
drwx------ · 755 就太宽了-rw------- · 644 和 664 都太宽chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
验证: ls -ld ~/.ssh → drwx------ · ls -l ~/.ssh/id_ed25519 → -rw-------
05退休的语言
某一个拒收带着日期——8.8,2021-10-01 发布,不再说 ssh-rsa 这门话
「ssh-rsa 签名方案 ... 默认已禁用」——OpenSSH 8.8 发行说明,2021-10-01。
2018 年生成的 RSA 钥匙没坏——只是它的签名格式没人再讲了
ssh-keygen -t ed25519 ——一把新钥匙,用所有服务器都还听得懂的话rsa-sha2-256 不必重新生成——签名原地升级ssh-copy-id 追加钥匙并摆好健康的权限——它存在,就是因为手工粘贴会栽在半截行上ssh-keygen -t ed25519
ssh-copy-id deploy@staging
$ ssh -o BatchMode=yes deploy@staging 'echo ok'
ok
验证: ssh -o BatchMode=yes deploy@staging 'echo ok' → ok,无提示符
线缆到此为止 · 没有任何 fetch · 全程本地