You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CheckMK监控系统PowerShell停机脚本转Bash后REST API认证失败排查求助

解决Bash调用CheckMK REST API时的401认证失败问题(从PowerShell迁移)

作为刚接触Bash的新手,遇到API认证失败确实很头疼——我帮你拆解下问题所在,然后给你一套简单易懂的解决方案,完全对应你原来的PowerShell逻辑。

先分析你之前的错误原因

  1. 使用-u参数的问题:curl -u是用来做Basic认证的,但你的PowerShell脚本里用的是Bearer认证(把用户名密码直接放在Bearer后面),两种认证方式完全不同,所以CheckMK服务器不认,返回401。
  2. 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

关键注意点(新手必看)

  1. 引号的使用:Bash里单引号和双引号区别很大——单引号里的内容不会被变量替换,双引号会。所以构造JSON时,我们用单引号包裹固定部分,用双引号包裹变量部分,确保JSON格式正确。
  2. --location参数:专门用来处理McAfee网关的重定向问题,避免被网关拦截后返回认证提示页面。
  3. 时间格式:用date -u生成UTC时间,和PowerShell的ToString("u")格式完全一致,避免CheckMK服务器因为时区问题报错。
  4. 函数调用:你可以直接在脚本最后添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:02:37