服务器多?密码烦?用这个脚本,一键搞定 SSH 免密信任!

服务器
今天分享一个工业级脚本,三分钟建立全局SSH信任体系。该脚本用于自动化建立SSH​双向信任关系,支持从文件导入 IP 地址和密码,并自动清理密码中的空格。

你是否也经历过这些场景:

  • 管理 200 台服务器,每次部署都要手动输入密码。
  • 新同事误操作导致known_hosts文件混乱。
  • 密钥泄露后连夜逐台服务器替换。

今天分享一个工业级脚本,3 分钟建立全局SSH信任体系。

一、免密登录的基本原理

在Linux服务器之间实现SSH免密登录,主要依赖公私钥认证 机制:

  • 跳板机生成SSH密钥对(私钥&公钥)
  • 将公钥(id_rsa.pub)分发到目标服务器的 ~/.ssh/authorized_keys
  • 确保权限正确,SSH配置允许公钥认证
  • 验证SSH免密登录是否生效。

二、代码实现

1. 读取列表清单

文件中的信息是以“IP 地址:密码”的格式呈现的,同时我们也支持在文件中添加注释以及留空行。以下函数是检查目标文件。

# 输入验证:检查目标文件
validate_input() {
    # 检查目标文件是否存在
    if [ ! -f "$TARGET_FILE" ]; then
        echo "[ERROR] 目标文件不存在: $TARGET_FILE" | tee -a $LOG_FILE
        exit 1
    fi

    # 读取文件并过滤有效IP和密码(支持#注释和空行)
    mapfile -t TARGET_ENTRIES < <(grep -vE '^#|^$' "$TARGET_FILE")

    # 检查是否读取到有效条目
    if [ ${#TARGET_ENTRIES[@]} -eq 0 ]; then
        echo "[ERROR] 目标文件中未找到有效IP和密码" | tee -a $LOG_FILE
        exit 1
    fi

    echo "[$(date +%F%T)] 已加载目标IP和密码列表:" | tee -a $LOG_FILE
    printf '%s\n' "${TARGET_ENTRIES[@]}" | tee -a $LOG_FILE
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

2. 生成密钥

以下函数是在.ssh生成一个秘钥对。

# 生成跳板机密钥
generate_key() {
    echo "[$(date +%F%T)] 正在生成跳板机密钥..." | tee -a $LOG_FILE
    if [ ! -f ~/.ssh/id_${KEY_TYPE} ]; then
        ssh-keygen -t ${KEY_TYPE} -N "" -f ~/.ssh/id_${KEY_TYPE} -q
        [ $? -eq 0 ] && echo "密钥生成成功" || exit 1
    fi
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

3. 部署公钥文件

秘钥对生成后,通过以下函数部署公钥。

# 批量部署公钥到目标节点
deploy_key() {
    local ip=$1
    local password=$2
    echo "[$(date +%F%T)] 正在处理节点 $ip" | tee -a $LOG_FILE

    for ((i=1; i<=$RETRY_TIMES; i++)); do
        SSHPASS="$password" sshpass -e ssh-copy-id \
            -o StrictHostKeyChecking=no \
            -o ConnectTimeout=10 \
            -i ~/.ssh/id_${KEY_TYPE}.pub \
            $USER@$ip >/dev/null 2>&1

        if [ $? -eq 0 ]; then
            echo "节点 $ip 公钥部署成功" | tee -a $LOG_FILE
            return 0
        else
            echo "节点 $ip 第$i次尝试失败,等待重试..." | tee -a $LOG_FILE
            sleep $((i*2))
        fi
    done
    echo "[ERROR] 节点 $ip 公钥部署失败!" | tee -a $LOG_FILE
    return 1
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

三、脚本演示

先准备设备清单。内容如下:

# 生产环境服务器列表
192.168.31.101:password
192.168.31.102:password
192.168.31.103:password
  • 1.
  • 2.
  • 3.
  • 4.

执行如下命令给脚本赋予执行的权限

chmod +x auto_ssh_trust.sh
  • 1.

执行完成上述命令后,输出如下结果:

脚本亮点:

(1) 支持 IP 和密码文件格式

  • 文件格式为 IP:密码,支持注释(以#开头)和空行
  • 自动解析并提取 IP 和密码:
ip=$(echo "$entry" | cut -d':' -f1 | xargs)
password=$(echo "$entry" | cut -d':' -f2 | xargs)
  • 1.
  • 2.

(2) 日志记录与审计

  • 记录每个节点的部署状态(成功/失败)
  • 生成校验报告,验证信任关系是否建立成功

(3) 错误处理与重试机制

  • 单节点失败后自动重试(最多 3 次)
  • 跳过无效条目,继续处理其他节点。

四、小结

该脚本用于自动化建立SSH双向信任关系,支持从文件导入 IP 地址和密码,并自动清理密码中的空格。通过生成Ed25519密钥、批量部署公钥、配置反向信任和记录审计日志,帮助运维人员高效管理多台服务器的SSH免密登录。

责任编辑:赵宁宁 来源: 攻城狮成长日记
相关推荐

2015-05-28 15:32:14

Linuxssh

2025-01-03 10:44:12

Linux

2025-03-28 07:56:39

Spring服务配置

2025-03-19 09:47:08

Shell服务器脚本

2019-11-28 08:25:53

Linux脚本SSH

2022-07-27 14:59:20

原子化服务鸿蒙

2009-11-20 16:50:02

无线路由器

2015-11-03 15:29:49

ONOS开放网络操作系统SDN

2024-06-17 10:30:38

运维IP地址网络

2019-12-19 09:23:13

脚本语言LinuxPython

2025-04-09 10:16:29

2021-03-18 09:08:44

MicrosoftExchange漏洞

2024-12-30 09:24:19

运维监控插件

2025-04-02 09:10:00

LinuxShell脚本

2023-02-21 10:07:23

2022-05-13 15:15:18

服务器OAuth2控制台

2012-11-01 13:14:26

遨游浏览器

2019-10-23 04:37:56

Jschsftp服务器

2009-06-08 10:30:00

ASP脚本服务器
点赞
收藏

51CTO技术栈公众号