CheckMK监控系统PowerShell停机脚本转Bash后REST API认证失败排查求助
解决Bash调用CheckMK REST API时的401认证失败问题(从PowerShell迁移)
作为刚接触Bash的新手,遇到API认证失败确实很头疼——我帮你拆解下问题所在,然后给你一套简单易懂的解决方案,完全对应你原来的PowerShell逻辑。
先分析你之前的错误原因
- 使用
-u参数的问题:curl -u是用来做Basic认证的,但你的PowerShell脚本里用的是Bearer认证(把用户名密码直接放在Bearer后面),两种认证方式完全不同,所以CheckMK服务器不认,返回401。 - Bearer头的写法错误:你在Bash里定义数组的方式不对,而且JSON数据格式也错了(没有用双引号包裹键和值),再加上McAfee网关可能拦截了格式不规范的请求,导致最终还是认证失败。
正确的Bash脚本实现
下面是完全对应你原PowerShell逻辑的Bash脚本,每一步都加了注释,新手也能看懂:
#!/bin/bash # 定义设置停机时间的函数 set_downtime() { # 设置默认参数,和原PowerShell对应 local USERNAME="XXX" local PASSWORD="YYY" local HOSTNAME="$1" # 必填参数:主机名 local TIME="${2:-30}" # 可选参数:停机时长,默认30分钟 # -------------------------- # 第一步:查询当前主机的停机时间(可选,和原逻辑对应) # -------------------------- # 构造查询的JSON请求体 local query_body='{"host_name": "'"$HOSTNAME"'"}' echo "正在查询主机 $HOSTNAME 的停机时间..." curl -X GET \ --header "Accept: application/json" \ --header "Authorization: Bearer $USERNAME $PASSWORD" \ --data "$query_body" \ --location # 加上这个参数处理McAfee网关的重定向 "目标URL" # 替换成你的CheckMK API实际URL # -------------------------- # 第二步:设置新的停机时间 # -------------------------- # 处理时间格式:和PowerShell的"u"格式(ISO 8601 UTC)一致 # 开始时间:当前时间减2小时(UTC) local start_time=$(date -d "-2 hours" -u +"%Y-%m-%dT%H:%M:%SZ") # 结束时间:开始时间加指定分钟数 local end_time=$(date -d "$start_time + $TIME minutes" -u +"%Y-%m-%dT%H:%M:%SZ") # 构造设置停机时间的JSON请求体 local comment="$TIME min Restart Downtime" # 原脚本的$EXTRAINFO如果需要可以在这里添加参数 local set_body=$(printf '{ "start_time": "%s", "end_time": "%s", "comment": "%s", "host_name": "%s", "downtime_type": "host" }' "$start_time" "$end_time" "$comment" "$HOSTNAME") echo -e "\n正在为主机 $HOSTNAME 设置 $TIME 分钟停机时间..." curl -X POST \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer $USERNAME $PASSWORD" \ --data "$set_body" \ --location # 处理McAfee网关重定向 "目标URL" # 替换成你的CheckMK API实际URL } # 调用示例:第一个参数是主机名,第二个是可选的停机时长 # set_downtime "ZZZ" 60
关键注意点(新手必看)
- 引号的使用:Bash里单引号和双引号区别很大——单引号里的内容不会被变量替换,双引号会。所以构造JSON时,我们用单引号包裹固定部分,用双引号包裹变量部分,确保JSON格式正确。
--location参数:专门用来处理McAfee网关的重定向问题,避免被网关拦截后返回认证提示页面。- 时间格式:用
date -u生成UTC时间,和PowerShell的ToString("u")格式完全一致,避免CheckMK服务器因为时区问题报错。 - 函数调用:你可以直接在脚本最后添加
set_downtime "ZZZ"来测试,或者把脚本保存为set_downtime.sh,然后用bash set_downtime.sh ZZZ 30调用。
测试小技巧
如果还是有问题,可以先单独测试认证是否成功:
curl --header "Authorization: Bearer XXX YYY" --header "Accept: application/json" --location "目标URL"
如果这个命令能返回正常的JSON数据,说明认证没问题,再检查后续的请求体格式即可。
内容的提问来源于stack exchange,提问作者Svejo
相关产品推荐
相关产品推荐

