编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

【Linux】工业级shell脚本一键搞定 SSH 免密信任!

wxchong 2025-03-19 03:24:09 开源技术 39 ℃ 0 评论

今天分享一个工业级脚本,三分钟建立全局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 }

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 .sshid_key_type.pub \ userip>/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)

(2) 日志记录与审计

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

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

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

四、小结

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


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表