如何在Linux服务器B上配置SSH密钥实现免密登录多台远程主机?
当然有可行的方法!既然你已经搞定了A到B的免密登录,那从B到其他主机的免密配置逻辑其实是类似的,不过也有一些批量优化的小技巧,我给你拆解清楚:
核心问题解答:是否需要在每台目标主机(C/D/E/F)上配置密钥?
是的,本质上每台目标主机都需要识别B的公钥才能允许免密登录——这就像你要进不同的房子,得把自己的门禁卡给每栋楼的管理员备案才行。不过不用怕麻烦,我们可以用工具减少重复操作,不用手动一台台复制。
方法一:单台主机手动配置(适合少量主机)
如果只有两三台主机要配置,手动操作最直接:
在B上生成SSH密钥对(如果还没生成的话)
执行命令:ssh-keygen -t ed25519(ed25519是更安全的密钥类型,嫌麻烦用RSA也可以:ssh-keygen -t rsa -b 4096)
一路回车默认即可,别设置密钥密码——不然每次登录还是要输密码,失去免密意义。把B的公钥复制到目标主机(比如C)
最省心的方式是用ssh-copy-id工具:ssh-copy-id username@C的IP地址
第一次执行会要求输入C的登录密码,输入后工具会自动把B的公钥添加到C的~/.ssh/authorized_keys文件里,还会自动设置正确的文件权限(权限不对的话免密登录会直接失败,这个工具帮你省了手动调权限的步骤)。
如果目标主机没有ssh-copy-id,也可以手动复制:- 在B上查看公钥内容:
cat ~/.ssh/id_ed25519.pub,复制输出的全部内容 - 登录到C,先确保
.ssh目录存在:mkdir -p ~/.ssh && chmod 700 ~/.ssh - 编辑
authorized_keys文件:nano ~/.ssh/authorized_keys,把复制的公钥粘贴进去,保存退出后设置权限:chmod 600 ~/.ssh/authorized_keys
- 在B上查看公钥内容:
测试免密登录:执行
ssh username@C的IP地址,应该直接登录成功,不用输密码。
方法二:批量配置多台主机(适合C/D/E/F这类多台主机)
如果主机数量多,手动操作太繁琐,试试下面两种批量方案:
方式1:用bash循环脚本批量复制
先创建一个包含所有目标主机信息的文件hosts_list.txt,每行格式为用户名@主机IP:
user1@192.168.1.100 user2@192.168.1.101 user3@192.168.1.102
然后写一个简单的脚本copy_keys.sh:
#!/bin/bash while read host; do ssh-copy-id "$host" done < hosts_list.txt
给脚本加执行权限:chmod +x copy_keys.sh,运行./copy_keys.sh,依次输入每台主机的密码即可。如果所有主机的用户名和密码都相同,还可以用expect工具实现完全自动输入(先安装expect:sudo apt install expect,再写一个expect脚本自动处理密码输入)。
方式2:用Ansible批量配置(专业自动化方案)
如果经常管理多台服务器,Ansible能帮你省超多事:
- 在B上安装Ansible:
sudo apt install ansible(Debian/Ubuntu)或sudo yum install ansible(CentOS/RHEL) - 创建主机清单文件
inventory.ini,格式如下:
[remote_hosts] C ansible_host=192.168.1.100 ansible_user=user1 D ansible_host=192.168.1.101 ansible_user=user2 E ansible_host=192.168.1.102 ansible_user=user3
- 执行批量推送公钥的命令:
ansible remote_hosts -m authorized_key -a "user={{ ansible_user }} key='{{ lookup('file', '~/.ssh/id_ed25519.pub') }}'" --ask-pass
输入一次密码(如果所有主机密码相同),Ansible就会自动把B的公钥推送到所有目标主机,还会自动配置好正确的权限。
额外注意事项
- 确保目标主机的SSH服务允许密钥登录:检查
/etc/ssh/sshd_config文件,确认PubkeyAuthentication yes;配置完成后可以把PasswordAuthentication改成no,提升服务器安全性,修改后重启SSH服务:sudo systemctl restart sshd - 如果B的私钥设置了密码(之前生成时手滑设了),可以用
ssh-agent缓存密码:在B上执行eval $(ssh-agent),再执行ssh-add ~/.ssh/id_ed25519,输入一次密码后,后续登录就不用再输了(重启会话后需要重新执行)。
内容的提问来源于stack exchange,提问作者aruncoder




