我在这篇文章中写了一个小的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,所以这是我试图让这个过程自动化的尝试。
答案 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 -x
和set +x
来激活调试/跟踪模式来尝试查看真正发生的事情。