You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Linux服务器B上配置SSH密钥实现免密登录多台远程主机?

当然有可行的方法!既然你已经搞定了A到B的免密登录,那从B到其他主机的免密配置逻辑其实是类似的,不过也有一些批量优化的小技巧,我给你拆解清楚:

核心问题解答:是否需要在每台目标主机(C/D/E/F)上配置密钥?

是的,本质上每台目标主机都需要识别B的公钥才能允许免密登录——这就像你要进不同的房子,得把自己的门禁卡给每栋楼的管理员备案才行。不过不用怕麻烦,我们可以用工具减少重复操作,不用手动一台台复制。


方法一:单台主机手动配置(适合少量主机)

如果只有两三台主机要配置,手动操作最直接:

  1. 在B上生成SSH密钥对(如果还没生成的话)
    执行命令:ssh-keygen -t ed25519(ed25519是更安全的密钥类型,嫌麻烦用RSA也可以:ssh-keygen -t rsa -b 4096
    一路回车默认即可,别设置密钥密码——不然每次登录还是要输密码,失去免密意义。

  2. 把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
  3. 测试免密登录:执行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能帮你省超多事:

  1. 在B上安装Ansible:sudo apt install ansible(Debian/Ubuntu)或sudo yum install ansible(CentOS/RHEL)
  2. 创建主机清单文件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
  1. 执行批量推送公钥的命令:
    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

火山引擎 最新活动