SSH 免密登录:配置与排查
约 1792 字大约 6 分钟
2026-10-29
每次 ssh 连接远程服务器都要输密码,既麻烦也不利于脚本化。本文前半部分介绍 SSH 免密登录的标准配置方法(生成密钥 → 部署公钥 → 配置别名),后半部分记录一次真实的免密登录失败排查案例——公钥已正确写入 authorized_keys 却仍然要求输密码,最终定位到服务器端目录权限问题。
一、配置免密登录
整体流程:
- 在本地生成公钥和私钥
- 将公钥添加到远程主机
- 修改本地
SSH配置文件,配置主机别名 - 测试免密登录
1. 生成 RSA 密钥
Windows 下的生成方法可参考 windows 生成 RSA 密钥,Linux/macOS 下使用 ssh-keygen,过程类似。
2. 添加公钥到远程主机
将生成的公钥内容追加到服务器的 ~/.ssh/authorized_keys 文件中:
注意
authorized_keys文件权限必须是600,权限过于开放会被 sshd 拒绝(见下文排查案例)。
如果是添加到 GitHub,则登录 GitHub 后进入 Settings → SSH and GPG keys → New SSH key,粘贴公钥并取一个便于区分来源的名称。
3. 配置本地 ~/.ssh/config
公钥部署好后,ssh root@10.1.1.1 已经可以免密码登录,但用户名和 IP 又长又难记,也可能出于安全原因不想明文暴露。可以通过 ~/.ssh/config(默认不存在,自行创建)给主机起别名:
Host example
HostName example.com
User root
Port 22
IdentityFile ~/.ssh/id_rsa| 字段 | 含义 |
|---|---|
Host | 主机别名,登录时使用 |
HostName | 服务器公网 IP 或域名 |
Port | SSH 端口号 |
User | 登录用户名 |
IdentityFile | 本地私钥文件路径 |
之后用别名登录即可:
$ ssh example4. 连接测试
测试 GitHub 连通性:
$ ssh -T git@github.com
Hi matiastang! You've successfully authenticated, but GitHub does not provide shell access.首次登录一台新服务器时会有指纹确认提示(防中间人攻击),输入 yes 即可,之后不会再提示:
The authenticity of host '10.1.1.1 (10.1.1.1)' can't be established.
ECDSA key fingerprint is SHA256:nGvmS+JKzQf1gG+Nzc0QN/qS6xSp1iV0rJFP1dILel4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes5. 服务端开启公钥登录
有些服务器的 sshd 未开启公钥登录选项,ssh root@10.1.1.1 后仍然提示输入密码。到服务器上修改 /etc/ssh/sshd_config,找到 PubkeyAuthentication 项,取消注释并确保为 yes:
#PubkeyAuthentication no # 错误配置
PubkeyAuthentication yes # 正确配置重启 sshd 服务后生效:
$ service sshd restart二、免密失败排查实录
配置步骤都正确,公钥也写进了 authorized_keys,连接时却仍然提示输密码。下面是完整的排查过程(场景:绿联 UGOS Pro NAS)。
问题现象
客户端用指定私钥连接,公钥认证没有被接受,回退到了密码认证:
$ ssh -v -i C:\Users\matia\.ssh\MT\rsa\mt_nas_rsa -o IdentitiesOnly=yes TDY@10.0.0.21
debug1: Authenticating to 10.0.0.21:22 as 'TDY'
# ...(连接与密钥交换调试信息省略)
debug1: Next authentication method: publickey
debug1: Offering public key: C:\\Users\\matia\\.ssh\\MT\\rsa\\mt_nas_rsa RSA SHA256:1t9SpR8wYNaXU3fQWooiDu/DDSP0OeytfPmt2rp0Gt0 explicit agent
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: password
TDY@10.0.0.21's password:
-v参数用于打印调试信息,是排查 SSH 认证问题的利器。
第一步:查看服务端 sshd 日志
在 NAS 上查看 sshd 状态与最近日志:
$ sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Fri 2025-10-24 17:58:27 CST; 1 week 1 day ago
# ...(进程信息省略)
Nov 01 21:33:51 DXP4800PLUS-5727 sshd[1869839]: /home/TDY/.ssh/authorized_keys is Linux mode
Nov 01 21:33:51 DXP4800PLUS-5727 sshd[1869839]: Authentication refused: bad ownership or modes for file /home/TDY/.ssh/>关键就是最后这句 Authentication refused: bad ownership or modes:sshd 认为密钥相关文件或目录的属主/权限不符合安全要求,直接拒绝公钥认证,于是回退到密码登录。
第二步:收紧 .ssh 目录与 authorized_keys 权限
查看家目录,发现 NAS 上几乎所有目录都是 777(drwxrwxrwx),.ssh 也不例外。按 OpenSSH 的要求收紧权限:
TDY@DXP4800PLUS-5727:~$ ls -la
drwxrwxrwx 1 TDY admin 30 Nov 1 21:28 .ssh
# ...(其他目录均为 drwxrwxrwx,省略)
TDY@DXP4800PLUS-5727:~$ chmod 700 .ssh/
TDY@DXP4800PLUS-5727:~$ chmod 600 .ssh/authorized_keys
TDY@DXP4800PLUS-5727:~$ cd .ssh
TDY@DXP4800PLUS-5727:~/.ssh$ ls -al
total 4
drwx------ 1 TDY admin 30 Nov 1 21:28 .
drwxrwxrwx 1 TDY admin 202 Nov 1 17:44 ..
-rw------- 1 TDY admin 744 Nov 1 18:31 authorized_keys.ssh 已改为 700,authorized_keys 已改为 600。但注意 ..(家目录本身)仍然是 drwxrwxrwx。
第三步:仍被拒绝,问题出在家目录
再次连接仍然失败,服务端日志这次指向了 /home/TDY 目录本身:
Nov 01 22:10:21 DXP4800PLUS-5727 sshd[1902299]: permission denied: ugacl count is 3
Nov 01 22:10:21 DXP4800PLUS-5727 sshd[1902299]: Authentication refused: bad ownership or modes for directory /home/TDY继续收紧家目录权限:
TDY@DXP4800PLUS-5727:/home$ ls -al
drwxrwxrwx 1 TDY admin 202 Nov 1 17:44 TDY
# ...(其他用户目录省略)
TDY@DXP4800PLUS-5727:/home$ chmod 755 TDY/
TDY@DXP4800PLUS-5727:/home$ ls -al
drwxr-xr-x 1 TDY admin 202 Nov 1 17:44 TDY第四步:连接成功
再次使用私钥连接,公钥认证通过,不再要求输入密码:
PS C:\Users\matia> ssh -v -i C:\Users\matia\.ssh\MT\rsa\mt_nas_rsa -o IdentitiesOnly=yes TDY@10.0.0.21
# ...(连接与密钥交换调试信息省略)
debug1: Offering public key: C:\\Users\\matia\\.ssh\\MT\\rsa\\mt_nas_rsa RSA SHA256:1t9SpR8wYNaXU3fQWooiDu/DDSP0OeytfPmt2rp0Gt0 explicit agent
debug1: Server accepts key: C:\\Users\\matia\\.ssh\\MT\\rsa\\mt_nas_rsa RSA SHA256:1t9SpR8wYNaXU3fQWooiDu/DDSP0OeytfPmt2rp0Gt0 explicit agent
Authenticated to 10.0.0.21 ([10.0.0.21]:22) using "publickey".
# ...(会话建立调试信息省略)三、登录后家目录权限异常
免密登录成功后,突然发现登录用户对自己家目录反而没有权限了,ls -la 显示 d---------(任何人都不能访问):
TDY@DXP4800PLUS-5727:/home$ ls -la
drwxrwxrwx 1 HXX admin 38 Oct 30 2024 HXX
drwxrwxrwx 1 JS admin 38 May 31 20:12 JS
drwxrwxrwx 1 MT admin 38 Mar 17 2025 MT
d--------- 1 TDY admin 202 Nov 1 17:44 TDY切换为 root 用户修复。NAS(UGOS Pro)下先用 sudo -i 切到 root:
TDY@DXP4800PLUS-5727:/home$ sudo -i
[sudo] password for TDY:从 root 视角看,其他用户目录都是 770,刚才改成的 755 反而是特例,为了保持一致改成 770:
root@DXP4800PLUS-5727:/home# ls -al
drwxrwx--- 1 HXX admin 38 Oct 30 2024 HXX
drwxrwx--- 1 JS admin 38 May 31 20:12 JS
drwxrwx--- 1 MT admin 38 Mar 17 2025 MT
drwxr-xr-x 1 TDY admin 202 Nov 1 17:44 TDY
root@DXP4800PLUS-5727:/home# chmod 770 TDY/
root@DXP4800PLUS-5727:/home# ls -al
drwxrwx--- 1 TDY admin 202 Nov 1 17:44 TDY
root@DXP4800PLUS-5727:/home# exit
logout切回普通用户确认,家目录恢复正常访问:
TDY@DXP4800PLUS-5727:/home$ ls -al
drwxrwxrwx 1 HXX admin 38 Oct 30 2024 HXX
drwxrwxrwx 1 JS admin 38 May 31 20:12 JS
drwxrwxrwx 1 MT admin 38 Mar 17 2025 MT
drwxrwx--- 1 TDY admin 202 Nov 1 17:44 TDY小结
公钥认证对服务器端路径权限有严格要求,任何一环过于开放都会被 sshd 判定为 bad ownership or modes 而拒绝:
| 路径 | 权限要求 |
|---|---|
~/.ssh 目录 | 700 |
~/.ssh/authorized_keys 文件 | 600 |
| 用户家目录 | 不能对组和其他人开放(777 会被拒绝,755/770 均可) |
排查思路:客户端 ssh -v 看认证过程 + 服务端 sudo systemctl status sshd 看拒绝原因,两边日志对照着走即可。
参考
版权所有
版权归属:matiastang
许可证:Copyright © 2022-present tangdaoyong
