问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
51CTO
1.
https://server.51cto.com/article/810105.html

在运维工作中,管理多台服务器的SSH登录是一个常见需求。本文将介绍一个自动化脚本,帮助运维人员快速建立SSH免密信任体系,实现一键部署和管理。

一、免密登录的基本原理

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

  1. 跳板机生成SSH密钥对(私钥&公钥)
  2. 将公钥(id_rsa.pub)分发到目标服务器的 ~/.ssh/authorized_keys
  3. 确保权限正确,SSH配置允许公钥认证
  4. 验证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
}

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
}

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
}

三、脚本演示

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

# 生产环境服务器列表
192.168.31.101:password
192.168.31.102:password
192.168.31.103:password

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

chmod +x auto_ssh_trust.sh

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

脚本亮点:

  1. 支持 IP 和密码文件格式
  • 文件格式为 IP:密码,支持注释(以#开头)和空行
  • 自动解析并提取 IP 和密码:
    ip=$(echo "$entry" | cut -d':' -f1 | xargs)
    password=$(echo "$entry" | cut -d':' -f2 | xargs)
    
  1. 日志记录与审计
  • 记录每个节点的部署状态(成功/失败)
  • 生成校验报告,验证信任关系是否建立成功
  1. 错误处理与重试机制
  • 单节点失败后自动重试(最多 3 次)
  • 跳过无效条目,继续处理其他节点。

四、小结

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号