管理數十上百台 Linux 服務器,需定期輪換 Root 密碼,人工操作效率低且易出錯。本文提供基於 SSH 互信 + Expect/Shell 的全自動化方案。
expect(含 mkpasswd):yum install -y expect。# 1. 管理機生成金鑰對(一路回車)
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""
# 2. 批量分發公鑰(假設 IP 列表存放在 ip_list.txt)
for ip in $(cat ip_list.txt); do
ssh-copy-id -o StrictHostKeyChecking=no -p 22 root@$ip
done
驗證: ssh root@IP "hostname" 無需密碼即可返回主機名。
batch_chpasswd.sh#!/bin/bash
# 批量修改遠程服務器 Root 密碼
# 依賴:expect, mkpasswd, ssh 互信已建立
# 作者:Kerryhu | 博客:https://kerry.blog.51cto.com
IP_LIST="/root/ip_list.txt"
LOG_FILE="/var/log/batch_chpasswd_$(date +%F).log"
PASS_LEN=12
MIN_UPPER=3
# 檢查 IP 列表
[ ! -f "$IP_LIST" ] && { echo "IP list not found: $IP_LIST"; exit 1; }
echo "=== 開始批量修改密碼 $(date) ===" | tee -a "$LOG_FILE"
for IP in $(cat "$IP_LIST"); do
# 生成強密碼:長度12,至少3大寫
TMP_PWD=$(mkpasswd -l $PASS_LEN -C $MIN_UPPER -d 2 -c 2 -s 1)
NEW_PASS="${IP}_${TMP_PWD}" # 格式:IP_隨機密碼,便於區分
# 記錄原始密碼(生產環境建議加密存儲或對接密碼管理系統)
echo "$(date '+%F %T') $IP $NEW_PASS" >> /root/password_vault.txt
# 遠程修改密碼
if ssh -o ConnectTimeout=10 -o BatchMode=yes root@$IP "echo '$NEW_PASS' | passwd --stdin root" &>/dev/null; then
echo "$(date '+%F %T') [SUCCESS] $IP 密碼修改成功" | tee -a "$LOG_FILE"
else
echo "$(date '+%F %T') [FAILED] $IP 密碼修改失敗,請手動排查" | tee -a "$LOG_FILE"
fi
done
echo "=== 批量修改結束 $(date) ===" | tee -a "$LOG_FILE"
mkpasswd -l 12 -C 3 -d 2 -c 2 -s 1 確保:12 位長度、≥3 大寫、≥2 數字、≥2 小寫、≥1 特殊符號,符合等保三級密碼複雜度要求。
ConnectTimeout=10 避免單台卡死阻塞整體流程。BatchMode=yes 強制使用公鑰認證,失敗即報錯,不回退交互式輸入。示例中明文追加至 /root/password_vault.txt 僅為演示。生產環境**必須**:
unset NEW_PASS)。chmod 600。若目標機器 SSH 端口不統一,可擴展 IP 列表格式為 IP:PORT,腳本中解析:
IFS=':' read -r IP PORT <<< "$LINE"
PORT=${PORT:-22} # 默認 22
ssh -p $PORT ...
通過 SSH 互信 + Shell 腳本,實現了百台級服務器 Root 密碼的分鐘級批量輪換。核心優勢:**無需在目標機部署 Agent、依賴標準工具鏈、邏輯透明可審計**。配合定時任務(Crontab/Systemd Timer)即可落地自動化合規輪換流程。