跳到主要内容 SSH 免密登录配置完整指南 | 极客日志
Shell / Bash
SSH 免密登录配置完整指南 SSH 免密登录基于非对称加密实现,通过本地生成密钥对并将公钥上传至远程机器的 authorized_keys 文件完成认证。配置涵盖 Linux 到 Linux、Windows 到 Linux 及多服务器互信场景,支持 ED25519 和 RSA 算法。关键步骤包括生成密钥、使用 ssh-copy-id 或手动复制公钥、验证权限及测试连接。安全方面建议禁用密码登录并严格限制.ssh 目录权限为 700 和 600。常见问题排查需关注网络端口、权限设置及 SSH 配置文件状态。
王者 发布于 2026/2/25 更新于 2026/4/18 1 浏览SSH 免密登录配置完整指南
本文档详细说明 SSH 免密登录 的配置方法(含本地→远程、多服务器互信),同时补充Windows(Git Bash/WSL)连 Linux 免密 、禁用密码登录强化安全 、多密钥管理 等实用场景,步骤适配所有主流 Linux 发行版(CentOS/Ubuntu/Debian/AlmaLinux),核心原理为SSH 公钥认证 ,配置后无需重复输入密码即可登录/执行远程命令。
一、核心原理
SSH 免密登录基于非对称加密 实现,核心分 3 个环节:
本地机器生成密钥对 (私钥 + 公钥 ),私钥本地严格保管,公钥可公开传输;
id_xxx
id_xxx.pub
将本地公钥 上传至目标远程机器 ,并添加到远程机器的 ~/.ssh/authorized_keys 文件(SSH 认证白名单);
本地发起 SSH 连接时,远程机器验证本地私钥与已保存的公钥是否匹配,匹配则直接放行,无需密码。 加密算法推荐 :优先用 ED25519(更安全、密钥体积小),兼容旧系统可使用 RSA(推荐 2048 位及以上)。
二、前置条件
本地和远程机器均安装 openssh-client 和 openssh-server(Linux 默认自带,未安装可按下方命令补装);
网络互通:本地能 ping 通远程机器的 IP/主机名,远程机器开放22 端口 (SSH 默认端口,防火墙/安全组需放行);
双方均有可登录的用户账号(推荐非 root 用户,root 免密需额外配置);
禁止修改本地/远程的 ~/.ssh 目录权限为过宽(如 777),Linux 对 SSH 认证目录的权限有严格限制 (核心避坑点)。
补装 OpenSSH 组件(若未安装)
yum install -y openssh-clients openssh-server
systemctl enable --now sshd
apt update && apt install -y openssh-client openssh-server
systemctl enable --now ssh
三、基础配置:本地 Linux → 远程 Linux 免密登录(最常用)
步骤 1:本地机器生成 SSH 密钥对 登录本地 Linux ,执行密钥生成命令(二选一,优先 ED25519),全程回车默认 即可(无需设置密钥密码,设置则为「双因素认证」,需输入密钥密码才能免密登录)。
推荐:ED25519 算法(高安全)
兼容旧系统:RSA 算法(2048 位及以上) ssh-keygen -t rsa -b 4096
执行结果说明 密钥对会默认生成在本地机器的 ~/.ssh/ 目录下,生成后目录下会出现 2 个核心文件:
ls -l ~/.ssh/
-rw------- 1 user user 411 月 日 时:分 id_ed25519
-rw-r--r-- 1 user user 102 月 日 时:分 id_ed25519.pub
关键 :本地私钥默认权限为 600(仅所有者可读可写),若被修改会导致 SSH 认证失败,无需手动调整。
步骤 2:将本地公钥上传至远程 Linux 机器 提供2 种上传方法 ,方法 1(ssh-copy-id) 最快捷(推荐),方法 2(手动复制) 适配无 ssh-copy-id 的极简系统(如嵌入式 Linux)。
方法 1:ssh-copy-id 一键上传(推荐) 核心命令格式:ssh-copy-id [远程用户]@[远程机器 IP/主机名],执行后输入远程机器的用户密码 即可完成上传(仅最后一次输入密码)。
远程机器若无 ~/.ssh 目录,自动创建(权限 700);
将本地公钥追加到远程机器的 ~/.ssh/authorized_keys 文件(权限 600);
自动校验目录/文件权限,避免手动配置的权限错误。
方法 2:手动复制公钥(适配无 ssh-copy-id 场景) 若本地/远程机器无 ssh-copy-id 命令,通过cat+ssh 手动传输公钥,步骤如下:
cat ~/.ssh/id_ed25519.pub | ssh [email protected] 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'
cat ~/.ssh/id_ed25519.pub | ssh -p 2222 [email protected] 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'
mkdir -p ~/.ssh:远程无.ssh 目录则创建,有则不报错;
cat >> ~/.ssh/authorized_keys:将本地公钥追加到远程认证文件(避免覆盖已有公钥);
chmod 700/600:强制设置远程.ssh 目录和认证文件的合规权限。
步骤 3:验证免密登录是否生效 本地机器执行 SSH 登录命令,无需输入密码 即成功登录,说明配置完成:
四、反向配置:远程 Linux → 本地 Linux 免密登录 若需要远程机器免密登录本地 ,仅需在远程机器重复上述步骤 1-3 :
远程机器执行 ssh-keygen 生成密钥对;
远程机器执行 ssh-copy-id 本地用户@本地 IP,输入本地机器密码;
远程机器执行 ssh 本地用户@本地 IP 验证免密。
五、特殊场景配置
场景 1:Windows(Git Bash/WSL/CMD)→ Linux 免密登录 Windows 下常用的 SSH 工具(Git Bash、WSL、PowerShell7+、OpenSSH)均支持该配置,步骤与 Linux 完全一致:
打开 Git Bash/WSL(推荐),执行 ssh-keygen -t ed25519 生成密钥对(密钥保存在 C:\Users\你的 Windows 用户名.ssh\);
执行 ssh-copy-id 远程用户@远程 IP 上传公钥;
执行 ssh 远程用户@远程 IP 验证免密。
场景 2:配置 root 用户免密登录(部分系统默认禁用) CentOS/RHEL 7+、Ubuntu 20.04+ 部分版本默认禁止 root 用户 SSH 密码登录 ,但公钥免密需确认远程机器的 SSH 配置,若 root 免密登录失败,按以下步骤开启:
systemctl restart sshd
systemctl restart ssh
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
场景 3:多 SSH 密钥管理(本地连接多个远程服务器,不同密钥) 若本地需要用不同密钥 连接不同远程服务器(如公司服务器用密钥 A,个人服务器用密钥 B),需创建SSH 配置文件 ~/.ssh/config,实现「按主机名自动匹配密钥」:
ssh company-server
ssh personal-server
设置配置文件权限(必须为 600,否则 SSH 忽略):
写入以下内容(按实际信息修改,可新增多个 Host):
Host company-server
HostName 192.168.1.100
Port 22
User root
IdentityFile ~/.ssh/id_ed25519_company
Host personal-server
HostName 10.0.0.5
Port 2222
User ubuntu
IdentityFile ~/.ssh/id_rsa_personal
场景 4:禁用密码登录,仅保留公钥认证(强化服务器安全) 免密登录验证成功后,强烈建议禁用远程机器的密码登录 ,避免暴力破解,步骤如下:
systemctl restart sshd
systemctl restart ssh
PasswordAuthentication no
PermitEmptyPasswords no
关键 :禁用密码前务必确保公钥免密登录正常,否则会导致无法远程登录服务器!
六、核心避坑点:权限配置(90% 的免密失败源于此) Linux SSH 对本地/远程 的 .ssh 目录和相关文件权限有严格限制 ,非合规权限会直接导致公钥认证失败,以下是必须遵守的权限规则 ,配置后若免密失败,优先检查权限:
本地机器(发起登录方)权限要求
ls -ld ~/.ssh && ls -l ~/.ssh/
文件/目录 必须权限 作用 ~/.ssh700(drwx------) 仅所有者可访问 ~/.ssh/id_ed25519/id_rsa(私钥)600(-rw-------) 仅所有者可读可写,严禁其他用户访问 ~/.ssh/id_ed25519.pub/id_rsa.pub(公钥)644(-rw-r–r–) 公钥可公开,权限无严格限制 ~/.ssh/config(若有)600(-rw-------) 仅所有者可访问
远程机器(被登录方)权限要求
ls -ld ~/.ssh && ls -l ~/.ssh/authorized_keys
文件/目录 必须权限 作用 ~/.ssh700(drwx------) 仅所有者可访问 ~/.ssh/authorized_keys(公钥白名单)600(-rw-------) 仅所有者可读写,禁止其他用户修改 远程用户家目录 ~ 不可为 777 若家目录权限为 777,SSH 会拒绝认证
权限修复命令(直接执行,一键修复远程机器权限)
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && chown -R 用户名:用户名 ~/.ssh
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && chown -R root:root ~/.ssh
七、免密登录失败:常见问题排查 若按步骤配置后仍需输入密码,按以下顺序排查(从易到难):
检查网络和端口 :本地 ping 远程 IP,执行 telnet 远程 IP 22 检查 22 端口是否开放;
检查权限 :按「第六节」修复本地/远程的.ssh 目录和文件权限;
检查 SSH 配置 :远程机器确认 sshd_config 中 PubkeyAuthentication yes 未被注释;
查看 SSH 调试日志 :本地执行带 -v 的 SSH 命令,查看认证失败原因(关键):
检查 SELinux/防火墙 :远程机器关闭 SELinux(临时)或放行 SSH 端口,关闭防火墙测试:
setenforce 0
systemctl stop firewalld
ufw disable
检查公钥是否匹配 :本地公钥内容与远程 authorized_keys 中的内容完全一致(无换行/空格错误);
cat ~/.ssh/id_ed25519.pub
cat ~/.ssh/authorized_keys
八、常用扩展命令 场景 命令 查看本地 SSH 密钥指纹 ssh-keygen -lf ~/.ssh/id_ed25519.pub远程机器查看已授权公钥 cat ~/.ssh/authorized_keys远程机器删除某条公钥 编辑 ~/.ssh/authorized_keys,删除对应行 本地测试 SSH 连接(不登录) ssh -T [email protected] 重启 SSH 服务(CentOS) systemctl restart sshd重启 SSH 服务(Ubuntu) systemctl restart ssh查看 SSH 服务状态 systemctl status sshd/ssh
九、总结
核心步骤 :本地生成密钥对 → 上传公钥到远程 → 验证权限 → 测试免密,全程仅需 3 个核心命令;
避坑核心 :严格遵守本地/远程的 .ssh 目录和文件权限,700(目录)/600(私钥/认证文件) 是关键;
安全最佳实践 :免密验证成功后,禁用远程机器的密码登录,仅保留公钥认证;避免用 root 用户日常登录,创建普通用户并赋予 sudo 权限;
多场景适配 :Windows 连 Linux、多密钥管理、root 免密均基于基础步骤扩展,重点修改配置文件和权限;
排查思路 :免密失败先查权限 ,再查SSH 配置 ,最后查网络/防火墙 ,用 ssh -v 查看调试日志是终极方法。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online