跳过正文

100 台 BMC 改密码,从半天缩到 20 分钟:一个脚本搞定批量改密 + 建监控账号

·2486 字·5 分钟·
作者
闫工
十年运营商机房 IT 运维,CCIE。做数据中心网络架构、GPU 服务器与裸金属交付,顺手写点自研小工具。

📌 转载说明:本文首发于微信公众号《闫工的算力工具箱》 原文链接:https://mp.weixin.qq.com/s/DwApGCxSZ8TCOIEV7lYSsg

【闫工的工具箱 · 第 11 弹|工具】
#

大家好!这次给大家分享一个机房运维中的小脚本工具。

先交代个背景:新机房一次性上架了 100 多台服务器,BMC 全顶着出厂默认密码。安全整改的单子已经下了,要求统一改强口令、加监控账号。

100 多台,逐台登 Web 界面:改密码、建账号、配权限。一台顺的话 5 分钟,不顺手 10 分钟。我算了算,半天没了,还得祈祷自己别手滑输错。

后来我把这活写成了脚本。100 台,20 分钟跑完,还带失败清单。今天就把这套东西给你,拿去改改 IP 就能用。

— — —

1. BMC 是什么?为什么非得管它?
#

BMC(Baseboard Management Controller),服务器的"带外管家"。机器死机、断电、系统起不来的时候,你还能通过它远程开机、看传感器、装系统。

它的权限,等于服务器的物理权限——能开机、能进固件、能读硬件传感器。出厂默认密码摆在那,等于把机房大门钥匙挂在门口。

安全整改第一件事,就是把这把钥匙换了,再给监控系统留一把低权限的备用钥匙。

2. 为什么不能一台台登 Web?
#

三个理由,每个都是泪:

  • 100 台 × 登录 + 改密 + 建账号,半天起步;
  • 手滑一次,密码没改成功但你以为改了,等于白干;
  • 改完还要复核。日志呢?审计呢?回头查哪个改了哪个没改,脑壳疼。

点鼠标最累的不是手,是心——你永远不确定"这一台到底改没改成"。

3. 破局:IPMI 协议,一行命令远控 BMC
#

IPMI(Intelligent Platform Management Interface)是服务器带外管理的开放标准协议,BMC 就是它的落地实现。IPMI 2.0 支持 lanplus 加密通道,走 UDP 623 端口远程执行命令。

Linux 下最常用的工具是 ipmitool:

# 装工具(RHEL/CentOS/Rocky)
yum install -y ipmitool
# 或(Debian/Ubuntu)
apt install -y ipmitool
# 远程查某台 BMC 的电源状态
ipmitool -I lanplus -H 10.X.X.10 -U Admin -P Admin chassis power status

一行命令能读状态,那改密码、建账号,自然也能远程批量干。

⚠️ 安全提醒(生产环境必看):示例里密码是明文写在命令行里的(-P Admin),仅用于演示。明文密码会留在 shell 历史、进程列表里——管理机上其他同事一个 ps aux 就能看到你的密码。生产环境请用 -f 参数从文件读密码,或通过环境变量注入:

# 方式一:从文件读密码(推荐)
echo -n 'Admin' > /root/.bmc_pass && chmod 600 /root/.bmc_pass
ipmitool -I lanplus -H 10.X.X.10 -U Admin -f /root/.bmc_pass chassis power status
# 方式二:环境变量注入(ipmitool 支持 IPMI_PASSWORD)
export IPMI_PASSWORD='Admin'
ipmitool -I lanplus -H 10.X.X.10 -U Admin chassis power status

批量脚本里同样建议:密码从配置文件读,不写死在命令行。

— — —

4. 批量脚本核心设计
#

脚本原理不复杂,但有四个设计点,缺一个都会翻车:

4.1 清单化:IP 列表文件,可注释可排除
#

# ips.txt —— 每行一个 BMC IP,支持 # 注释
10.X.X.10
10.X.X.11
\# 10.X.X.12   # 这台先排除,别改
10.X.X.13

4.2 动态探测 UserID(第一个坑就在这)
#

不同厂商的 BMC,默认管理员的 UserID 不一样。有的厂商是 2,有的不是。写死"管理员就是 UserID 2"的脚本,换一批机器就翻车。

所以第一件事是动态探测:

# 动态探测 UserID(不同厂商默认管理员 UserID 不一样,不能写死)
get_userid() {
    ipmitool -I lanplus -H "$1" -U "$OLD_USER" -P "$OLD_PASS" user list \
        | grep -i "$2" | awk '{print $1}'
}
# 改密:先定位管理员 UserID,再 set password
change_password() {
    uid=$(get_userid "$1" "$OLD_USER")
    ipmitool -I lanplus -H "$1" -U "$OLD_USER" -P "$OLD_PASS" \
        user set password "$uid" "$NEW_PASS"
}
# 建用户:从 UserID 3 开始找空闲槽位,避免覆盖已有账号
create_user() {
    for uid in $(seq 3 16); do
        name=$(ipmitool -I lanplus -H "$1" -U "$2" -P "$3" user list | awk -v id=$uid '$1==id{print $4}')
        [ -z "$name" ] && break   # 找到空闲槽位
    done
    ipmitool ... user set name "$uid" "$username"
    ipmitool ... user set password "$uid" "$upass"
    ipmitool ... channel setaccess 1 "$uid" callin=true ipmi=true link=true privilege="$priv"
    ipmitool ... user enable "$uid"
}

4.3 并发控制:20 台同时跑,带重试和超时
#

MAX_JOBS=20        # 并发数,别一上来全开
RETRY=2            # 单操作失败重试次数
CMD_TIMEOUT=15     # 单条命令超时(秒)
job_count=0
while read -r ip; do
    [[ -z "$ip" || "$ip" =~ ^# ]] && continue
    process_ip "$ip" &
    ((job_count++))
    (( job_count >= MAX_JOBS )) && { wait; job_count=0; }
done < ips.txt
wait

4.4 完整日志:每台独立日志 + 失败清单
#

跑完自动生成三样东西:

  • logs/bmc_*.log

    ——每台每一步的结果;

  • bmc_success.txt

    ——成功的 IP 清单;

  • bmc_fail_*.txt

    ——失败的 IP 清单。

失败的清单是重点。下一轮只重试这批,不用重新全量跑。批量脚本和一把梭的区别,就在这——出了事有据可依,不是黑箱操作。

另外,前面说"改完还要复核、审计",这套日志就是审计留底:每台每一步都有记录,安全审计要凭证的时候,翻 logs/ 就行,不用像登 Web 那样手动截图。

— — —

5. 执行 & 验证
#

chmod +x bmc_manage.sh
./bmc_manage.sh

跑完别急着收工,验证三步走:

# ① 改密前:旧密码还能用?(用旧密码随便查个状态)
ipmitool -I lanplus -H 10.X.X.10 -U Admin -P Admin chassis power status
# ② 改密后:旧密码应失效,新密码能登录
ipmitool -I lanplus -H 10.X.X.10 -U Admin -P NewStrongPassw0rd!2025 chassis power status
# ③ 账号列表里能看到新加的 monitor/operator/readonly
ipmitool -I lanplus -H 10.X.X.10 -U Admin -P NewStrongPassw0rd!2025 user list

— — —

6. 踩过的坑(抄作业前先看)
#

现象 真凶 解法
Unable to establish IPMI v2 / RMCP+ session 网络不通 / UDP 623 被挡 / 用户名大小写错 先单台测连通;确认管理 VLAN 放行 623
建了用户,user list 却看不到 槽位被占用 / 权限没生效 用空闲槽位探测;确认 channel setaccess 里 ipmi=true
改密成功,后续命令用新密码却失败 厂商默认管理员 UserID 不是 2(写死导致) 改用动态 get_userid,别假设管理员 ID
某品牌 BMC 改密返回成功,新密码却登录失败 BMC 固件版本太老,不支持 user set password 的某些参数格式 升级 BMC 固件;或改用 user enable + user disable 组合操作
并发跑着跑着超时 管理机网络/会话数顶不住 降 MAX_JOBS、加 CMD_TIMEOUT、加 RETRY

💡 兼容性提醒:不同厂商 BMC 对 ipmitool 的支持程度不一样,老款型号尤其容易有坑。批量跑之前,先拿一台测试机验证一条命令: ipmitool -H test_ip -U admin -P admin user list 能正常返回再批量跑,确认不了的厂商型号先排除。

安全铁律,三条:

  • BMC 必须进独立管理 VLAN,禁止对公网暴露 UDP 623;
  • 监控账号用低权限(Operator/User),禁止共用管理员账号;
  • 先小批量(≤5 台)灰度,确认无误再全量。批量改密失败会导致部分 BMC 失联——到时候哭都来不及。

— — —

END
#

批量改完 BMC,机器能远程管了。但新交付的 8 卡 GPU 服务器刚上架,训练一跑就卡死——nvidia-smi 显示 8 张卡都在,nvidia-fabricmanager 却反复起不来。NVLink 悄悄坏了一半,表面根本看不出来。

下期,聊聊一台 8 卡 GPU 服务器的 NVLink 故障排查:Fabric Manager 起不来,NVLink 悄悄坏了一半。

关注公众号

硬核实战经验,带你轻松避坑!

相关文章