“SSH免密登录配置命令”通常由两条命令组成:本机用 ssh-keygen 生成密钥对,再用 ssh-copy-id 把公钥写到目标主机的 ~/.ssh/authorized_keys。真正决定能不能免密的是目标端权限:~/.ssh 目录通常是 700,authorized_keys 通常是 600,家目录不能对同组或其他用户可写。如果已经执行过这两条命令却仍要输入密码,先不要反复重新生成密钥,应先查看 ssh -v 的输出,确认服务端是否提供了 publickey 认证方式。
适用场景:Linux 与 Linux、或 Linux 与 macOS 之间使用 OpenSSH 客户端做免密登录时,建议先确认客户端能用
ssh -V查到版本,再生成密钥并复制公钥。验证方式是执行ssh -v user@host,在输出中看到Offering public key和Server accepts key,并且最终不再提示输入密码。风险边界:免密登录等同于把该密钥的访问权交给持有者;私钥不要外传,给authorized_keys追加内容前先备份,避免覆盖已有公钥。
SSH免密登录配置命令Linux
在“SSH免密登录”这件事里,配置命令对应的就是“生成密钥对”和“把公钥登记到目标端”这两步,并不包括修改 sshd_config 这类服务端策略操作。判断当前卡在哪一步,可以先看本机是否已有密钥文件:
ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub如果两个文件都存在,说明生成密钥这一步已经完成;如果只有私钥没有 .pub,可以用 ssh-keygen -y -f ~/.ssh/id_ed25519 从私钥反推公钥内容核对。再确认目标端是否已登记你的公钥,在目标机上执行:
grep -f <(ssh-keygen -y -f ~/.ssh/id_ed25519) ~/.ssh/authorized_keys有输出说明公钥已在文件里;没有输出则说明复制公钥这一步没做或没做对。服务端是否允许公钥认证,可由目标机的 sshd_config 中 PubkeyAuthentication 项确认;这一项通常默认是开启的,需要结合具体发行版和配置确认。
SSH免密登录:先把能核对的事实摆清楚
先把对象和前提列清,再判断问题出在哪里。能核对的内容大致有这几类:

- 客户端版本:执行
ssh -V,输出类似OpenSSH_8.x,不同版本对密钥类型和默认算法的支持范围不同。 - 密钥是否存在:用
ls -l ~/.ssh/查看私钥和.pub公钥文件,注意默认权限和属主是否属于当前登录用户。 - 公钥登记情况:在目标机查看
~/.ssh/authorized_keys的内容和权限,用ls -ld ~ ~/.ssh ~/.ssh/authorized_keys一次性看全。 - 认证过程:执行
ssh -v user@host,看客户端询问了哪些认证方式、是否尝试 publickey、服务端是否接受。 - 服务端配置:在目标机用
sshd -T | grep -Ei 'pubkey|authorizedkeys'查看生效配置,替换成sudo sshd -T可以避免普通用户读配置受限。
这些事实摆清楚之后,再判断问题属于“密钥没生成”“公钥没登记”“权限不对”还是“服务端策略不允许”,不要一上来就重装或者改配置。
SSH免密登录最容易搞错的一点
最常见的误解,是把 ssh-copy-id 执行成功当成免密已经配置完成。实际上 ssh-copy-id 只完成“把公钥追加到远端 authorized_keys”这一个动作,它不保证文件权限正确,也不保证服务端接受这类密钥算法。另一个常见混淆是“复制公钥”和“复制私钥”:需要复制到目标端的是 id_ed25519.pub 或 id_rsa.pub 这类公钥文件,私钥始终留在本机。
要区分是权限问题还是认证方式问题,有一个直接动作:在目标机执行 ls -ld ~ ~/.ssh ~/.ssh/authorized_keys。如果 ~/.ssh 是 755 或者属于其他用户,或者 authorized_keys 对其他用户可读,服务端可能忽略这个文件;如果权限都正确但仍需密码,就再执行 ssh -v user@host,看服务端是否把 publickey 列入可用的认证方法。
SSH免密登录:一个照着就能做完的做法
下面按“本机生成、复制公钥、检查权限、测试登录”的顺序走一遍,命令中的用户和主机名需要换成自己的。

# 1. 本机生成密钥对,按提示直接回车使用默认路径;需要口令时可选设置
ssh-keygen -t ed25519 -C "$(whoami)@$(hostname)"
# 2. 把公钥复制到目标主机,执行时会要求输入一次目标用户的密码
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
# 3. 登录目标机,修正权限
ssh user@host
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod go-w ~
# 4. 回到本机测试免密登录
ssh -v user@host每一步该看到什么:第 1 步结束应提示密钥已保存,并在 ~/.ssh/ 下出现 id_ed25519 和 id_ed25519.pub;第 2 步结束应提示公钥已添加,或者提示公钥数量为 1;第 3 步的几条 chmod 不报错即视为执行成功,可以用 ls -ld 复查;第 4 步如果直接进入目标机 shell、不再输入密码,说明基础配置已经生效。执行 ssh -v 时,如果看到 Offering public key 后面跟着 Server accepts key,基本可以确认公钥认证已经走通。
如果目标机的 SSH 端口不是 22,ssh-copy-id 需要用 -p 指定端口,例如 ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub user@host;使用非默认密钥时,在 ~/.ssh/config 里给对应主机加上 IdentityFile 会更省事,配置后可以用 ssh -G host | grep -i identityfile 核对客户端实际读取的密钥路径。
SSH免密登录:怎么验证结果对不对
验证不应只看“登录时有没有要求输入密码”,还要确认走的是公钥登录。最直接的方式是:
ssh -o PreferredAuthentications=publickey -v user@host正常结果是在客户端输出中看到 Authentications that can continue: publickey、Offering public key、Server accepts key,最后进入远端 shell,并且没有出现 password: 提示。登录后可以执行 who 或 echo $SSH_CONNECTION,确认当前连接确实来自本机。
如果调试输出里出现 Permission denied (publickey),说明服务端没有接受这把公钥,需要回到 authorized_keys 的内容和权限上核查找问题。想看服务端侧的记录,可以在目标机查看 /var/log/auth.log(Debian/Ubuntu 常见位置)或 /var/log/secure(RHEL/CentOS 常见位置),具体路径需要结合发行版和 syslog 配置确认;某些系统需要 root 或加入 adm、wheel 一类用户组才能读取。日志中通常会出现 Accepted publickey for user,可以作为认证成功的核对位置。