SSH免密登录配置:从密钥生成到批量分发

SSH免密登录配置:从密钥生成到批量分发

你每登录一台服务器,就要输一次密码。你有5台服务器,每次登录都要输一遍。你开始觉得,花在输密码上的时间,加起来够写个小程序了。你想配置SSH密钥免密登录,但只会配一台。第二台又从头来一遍。今天教你怎么配一台,然后把密钥批量分发到所有服务器。


先看一个数据

在团队协作和生产环境中,免密登录带来的不仅是便利。配置了密钥登录后,你可以在脚本里安全地执行远程命令,不用在代码里写明文密码。手动操作效率提升一倍以上,因为省去了每次输入密码的时间。


第一步:生成密钥对

在你的本地电脑上操作。打开终端:

bash

ssh-keygen -t ed25519 -C "你的邮箱"

一路回车,会在~/.ssh/目录下生成两个文件:

  • id_ed25519:私钥,打死也不能给别人
  • id_ed25519.pub:公钥,可以公开

如果你已经有密钥了,跳过这步,直接进入下一步。


第二步:把公钥传到服务器

单台服务器:用ssh-copy-id

bash

ssh-copy-id user@服务器IP

输入一次密码,公钥自动追加到服务器的~/.ssh/authorized_keys里。以后登录不需要密码。

手动操作(如果ssh-copy-id不能用)

bash

# 复制公钥内容
cat ~/.ssh/id_ed25519.pub

# 登录服务器,把公钥加进去
mkdir -p ~/.ssh
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

第三步:批量分发公钥

当你有10台服务器时,ssh-copy-id一台台输10遍很麻烦。可以写一个脚本来处理:

bash

#!/bin/bash
# 批量分发公钥到多台服务器

SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
USER="root"
PASSWORD="你的密码"

for server in "${SERVERS[@]}"; do
    echo "正在处理 $server ..."
    sshpass -p "$PASSWORD" ssh-copy-id -o StrictHostKeyChecking=no $USER@$server
done

需要安装sshpassapt install sshpass。或者用更安全的ssh-copy-id配合循环输入密码。

危险操作提醒:脚本里的密码是明文的,用完及时删除。


第四步:用~/.ssh/config管理多台服务器

配完密钥后,每次还要ssh user@192.168.1.10。有了~/.ssh/config文件,你可以给每台服务器起别名:

bash

Host web1
    HostName 192.168.1.10
    User root
    IdentityFile ~/.ssh/id_ed25519

Host web2
    HostName 192.168.1.11
    User root

Host db
    HostName 192.168.1.20
    User admin

以后登录ssh web1就够了。如果同一个密钥用于多台服务器,把IdentityFile加在Host后面就行。如果不同服务器用不同的密钥,各自指定IdentityFile


第五步:用ssh-agent管理私钥

你的私钥可能有密码(passphrase),每次用都要输一遍。

ssh-agent可以替你记住密码:

bash

eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519

输入一次私钥密码,在当前终端会话里不用再输了。Mac用户还可以用ssh-add -K把密钥存到钥匙串里,重启不用重新加。


第六步:批量执行命令

密钥配好了,就可以在脚本里批量执行命令了。比如同时查看5台服务器的磁盘空间:

bash

for server in web1 web2 web3 db cache; do
    echo "=== $server ==="
    ssh $server "df -h"
done

或者用pssh工具(Parallel SSH)并行执行:

bash

pssh -h servers.txt -i "df -h"

servers.txt里每行一个服务器别名。


常见问题

Q:配完密钥还是提示输入密码

A:检查服务器上~/.ssh目录权限是不是700,authorized_keys是不是600。权限太松,SSH会忽略它。

Q:ssh-copy-id提示连接失败

A:检查服务器IP是否正确,防火墙是否放行22端口,密码是否输对了。如果服务器改了SSH端口,用-p 端口号参数。

Q:私钥文件权限太松

A:chmod 600 ~/.ssh/id_ed25519。私钥权限必须是600。

Q:换了电脑,之前的密钥还能用吗

A:把私钥文件(id_ed25519)复制到新电脑的~/.ssh/目录,权限设成600就可以继续用。或者重新生成一对密钥,把新公钥加到你所有服务器的authorized_keys里。


一个真实案例

某创业公司,运维管理着15台服务器。之前每次登录都要输密码,或者从密码管理器里复制粘贴。用了免密登录后,配合~/.ssh/config,登录一台服务器只需要敲3个字母。批量更新代码时,用一个脚本就能在所有服务器上执行命令。

他说:“以前最烦的就是输密码,现在终于不用了。省下的时间够我学新东西。”


最后一句

免密登录不是“懒”,是“聪明”。你把这10分钟花在配置上,未来每天省下5分钟。这笔账怎么算都划算。去把你的公钥传到所有服务器上。用ssh-copy-id配一遍,用~/.ssh/config起好别名。然后忘掉密码,用密钥说话。你的服务器会更欢迎你。

知识库

服务器运维中常见的“坑”:20个让你熬夜的瞬间

2026-6-17 16:59:03

知识库

服务器常用端口速查表:22、80、443、3306……分别是干什么的?

2026-6-18 16:05:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧