SSH配置免密登录,多服务器之间免密访问
在多台服务器之间来回切换时,每次都要输入密码确实很麻烦。
SSH免密登录就是通过密钥对代替密码验证,让你从一台机器直接登录另一台机器,不用再输密码。
这篇文章会带你从零开始,在两台或多台服务器之间配置SSH免密访问,并解决常见的权限和配置问题。
先搞清楚:免密登录到底靠什么
SSH免密登录依赖一对密钥:私钥和公钥。
私钥留在本地,公钥放到目标服务器的 ~/.ssh/authorized_keys 文件里。
当你发起连接时,服务器用公钥加密一段随机数据,只有持有私钥的客户端才能解密,验证通过后就允许登录。
整个过程不需要传输密码,比密码登录更安全,也适合自动化脚本和集群管理。
配置前,你需要确认:
- 本地和远程服务器都安装了OpenSSH客户端和服务端(大多数Linux发行版默认已装)。
- 你知道远程服务器的IP、SSH端口、登录用户名。
- 本地用户对
~/.ssh目录有写权限。
生成密钥对并分发公钥
第一步是在本地生成密钥对。
打开终端,执行:
ssh-keygen -t rsa -b 4096
连续按回车,使用默认路径 ~/.ssh/id_rsa,密码短语可以留空(直接回车),这样登录时完全不用输入任何密码。
如果对安全性要求高,可以设置一个密码短语,再配合 ssh-agent 使用。
生成后会得到两个文件:
~/.ssh/id_rsa:私钥,绝对不能泄露。~/.ssh/id_rsa.pub:公钥,需要复制到目标服务器。
随后把公钥复制到远程服务器。
最简单的方式是用 ssh-copy-id:
ssh-copy-id -p 22 user@192.168.1.100
把 user 换成远程用户名,192.168.1.100 换成目标IP,-p 指定SSH端口(默认22可省略)。
执行后会提示输入一次远程密码,成功后公钥会自动追加到远程的 ~/.ssh/authorized_keys 文件中。
如果没有 ssh-copy-id 命令,可以手动复制:
cat ~/.ssh/id_rsa.pub | ssh -p 22 user@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
这条命令会一次性创建目录、设置权限并写入公钥。
多台服务器之间互相免密
如果需要在多台服务器之间任意两两免密,比如A能免密登录B,B也能免密登录A,那就需要在每台服务器上都生成密钥对,然后把每台的公钥分发到其他所有服务器。
假设有三台机器:server1、server2、server3。
在每台机器上执行 ssh-keygen -t rsa -b 4096 生成各自的密钥对。
然后,在server1上把自己的公钥复制到server2和server3:
ssh-copy-id user@server2
ssh-copy-id user@server3
同样,在server2上把公钥复制到server1和server3,在server3上复制到server1和server2。
这样,每台服务器的 authorized_keys 里都包含了其他服务器的公钥,互相登录都不需要密码。
如果服务器数量较多,可以用循环批量分发:
for host in server2 server3; do
ssh-copy-id user@$host
done
权限与配置避坑指南
免密登录失败,十有八九是权限问题。
SSH对文件和目录权限要求非常严格:
~/.ssh目录权限必须是700。~/.ssh/authorized_keys文件权限必须是600。- 用户家目录
~权限不能是777,建议755或700。
检查并修正:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 755 ~
另外,检查远程服务器的 /etc/ssh/sshd_config 中这几项:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
如果修改了配置,需要重启SSH服务:
sudo systemctl restart sshd
注意:在重启sshd之前,务必保持当前SSH连接不要断开,并另外开一个窗口测试新连接,避免配置错误导致无法登录。
如果公司网络或云服务器有安全组,确保SSH端口(默认22)对来源IP开放。
验证免密是否生效
配置完成后,在本地直接执行:
ssh user@192.168.1.100
如果不再提示输入密码,直接进入远程命令行,说明免密登录成功。
你还可以用 -v 参数查看详细过程,确认使用的是公钥认证:
ssh -v user@192.168.1.100
输出中如果出现 Authenticated with public key 或类似字样,就表示公钥认证已生效。
对于多台服务器,可以写一个简单脚本一次性测试所有连接:
for host in server1 server2 server3; do
echo "Testing $host..."
ssh -o BatchMode=yes -o ConnectTimeout=3 user@$host "echo OK"
done
如果每台都返回OK,说明互相免密全部配置成功。
常见问题与快速排查
仍然提示输入密码:先检查 ~/.ssh/authorized_keys 内容是否正确,确保没有多余换行或空格。
再确认权限是否为600。
提示“Permission denied (publickey)”:通常是公钥没有正确写入,或者sshd_config中禁用了PubkeyAuthentication。
查看远程服务器日志 /var/log/secure 或 /var/log/auth.log 获取具体原因。
多台服务器之间有的通有的不通:检查是否每台机器的公钥都分发到了所有其他机器。
可以手动在目标机器上查看 authorized_keys 是否包含来源机器的公钥。
想更安全地管理私钥:可以为私钥设置密码短语,然后使用 ssh-agent 缓存。
执行 eval $(ssh-agent) 启动代理,再运行 ssh-add ~/.ssh/id_rsa 输入一次密码短语,当前会话内就不用重复输入了。
按照以上步骤操作后,你应该已经实现了多台服务器之间的SSH免密访问。
如果遇到问题,优先回看权限和sshd配置这两个部分,大部分故障都能在那里找到答案。