# 输入验证 validate_input() { TARGET_FILE="$1" if [ ! -f "$TARGET_FILE" ]; then echo "[ERROR] 目标文件不存在: $TARGET_FILE" | tee -a $LOG_FILE exit 1 fi mapfile -t TARGET_ENTRIES < <(grep -vE '^#|^$' "$TARGET_FILE") if [ ${#TARGET_ENTRIES[@]} -eq 0 ]; then echo "[ERROR] 目标文件中未找到有效IP和密码" | tee -a $LOG_FILE exit 1 fi }
# 生成密钥 generate_key() { if [ ! -f ~/.ssh/id_${KEY_TYPE} ]; then ssh-keygen -t ${KEY_TYPE} -N "" -f ~/.ssh/id_${KEY_TYPE} -q fi }
# 部署公钥 deploy_key() { local ip="$1" local password="$2" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 正在处理 $ip..." | tee -a $LOG_FILE for ((i=1; i<=$RETRY_TIMES; i++)); do if sshpass -p "$password" ssh-copy-id \ -o StrictHostKeyChecking=no \ -o ConnectTimeout=$SSH_TIMEOUT \ -i ~/.ssh/id_${KEY_TYPE}.pub \ "$USER@$ip" >> "$LOG_FILE" 2>&1; then echo "成功:$ip 公钥已部署" | tee -a $LOG_FILE return 0 else echo "[尝试 $i/$RETRY_TIMES] $ip 失败,等待重试..." | tee -a $LOG_FILE sleep $((i*2)) fi done echo "[ERROR] $ip 公钥部署失败!" | tee -a $LOG_FILE return 1 }
# 主流程 main() { validate_input "$1" generate_key while IFS=: read -r ip password; do deploy_key "$ip" "$password" done < "$TARGET_FILE" }