while循环执行nagios命令不能正常工作

时间:2017-01-24 17:33:49

标签: bash while-loop nagios

我在这篇文章中写了一个小的bash脚本:How to search for a string in a text file and perform a specific action based on the result

我注意到当我运行脚本并检查日志时,一切似乎都在工作,但是当我查看Nagios UI时,我文本文件中列出的服务器中几乎有一半没有禁用其通知。该脚本的修订版如下:

host=/Users/bob/wsus.txt

password="P@assw0rd123"

while read -r host; do
    region=$(echo "$host" | cut -f1 -d-)

    if [[ $region == *sea1* ]]
        then
            echo "Disabling host notifications for: $host"
            curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" https://nagios.$region.blah.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1
        else
            echo "Disabling host notifications for: $host"
            curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" https://nagios.$region.blah02.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1
    fi
done < wsus.txt >> /Users/bob/disable.log 2>&1

如果我对手动出现问题的服务器运行命令,它会在Nagios UI中被禁用,所以我有点困惑。仅供参考,我也不熟悉Bash,所以这是我试图让这个过程自动化的尝试。

1 个答案:

答案 0 :(得分:0)

1 - 在第一次出现https之前缺少双引号:

你有:

curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" https://nagios.$region.blah.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1

应该是:

curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" "https://nagios.$region.blah.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1

2 - 永远不会使用您的第一个变量host(在while循环中覆盖)。 我猜你要做的事情是这样的:

hosts_file="/Users/bob/wsus.txt"
log_file="/Users/bob/disable.log"

# ...

while read -r host; do
    # Do stuff with $host
done < $hosts_file >> $log_file 2>&1

3 - 这看起来很可疑:

if [[ $region == *sea1* ]]

注意:我还没有测试过,所以这是我对此的一般感觉,可能是错误的。

$region不是双引号,所以请确保没有空格/有趣的东西发生(但这不应该是双括号测试[[中的问题)。

*sea*看起来会被展开以匹配与此globbing匹配的当前目录文件。如果要将其作为正则表达式进行测试,则应使用~=运算符或(我最喜欢的某种原因)grep命令:

if grep -q ".*sea.*" <<< "$region"; then
    # Your code if match
else
    # Your code if no match
fi
  • -q保持grep q uiet
  • 无需像[[[那样进行测试,因为如果有任何匹配,grep的返回码已经为0
  • <<<只是将正确的字符串重定向为左侧命令的标准输入(避免像echo "$region" | grep -q ".*sea.*"这样无用的管道。)

如果这不能解决您的问题,请提供输入文件hosts_file的示例以及一些输出日志。

您还可以通过将脚本包含set -xset +x来激活调试/跟踪模式来尝试查看真正发生的事情。