2017-01-24 118 views
0

我在這篇文章中寫了一個小bash腳本:How to search for a string in a text file and perform a specific action based on the resultWhile循環執行Nagios的命令不能正常工作

我注意到,當我跑了劇本,並檢查日誌,一切都似乎是工作,但是當我看到Nagios UI中,我的文本文件中列出的幾乎一半服務器沒有禁用他們的通知。劇本的修訂版如下:

host=/Users/bob/wsus.txt 

password="[email protected]" 

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

您是否可以從日誌中確定問題是由「while」循環未讀取缺失服務器的行引起的,還是因爲命令被調用但失敗? – Fred

+1

將主機變量重命名爲'hostsfile =/Users/bob/wsus.txt',確保文件存在,然後將done行改爲'done <$ hostsfile >> /Users/bob/disable.log 2>&1' 。這應該做到這一點。 –

+0

@NagiosSupport工作,謝謝!我還注意到一些「失敗」的服務器在我的文本文件中有錯誤的FQDN ...... –

回答

0

1 - 有第一HTTPS occurence之前缺少雙引號:

您有:

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*看起來像它將被擴展匹配您當前匹配此匹配項的目錄文件。如果你要測試的這款爲正則表達式,你應該使用~=運營商或(我由於某種原因,喜歡的)grep命令:

if grep -q ".*sea.*" <<< "$region"; then 
    # Your code if match 
else 
    # Your code if no match 
fi 
  • -q保持grepq uiet
  • 沒有需要測試像[[[,因爲如果有任何匹配,grep的返回碼已經爲0
  • <<<只是將右邊的字符串重定向爲標準d命令的輸入(避免無用的管道,如echo "$region" | grep -q ".*sea.*")。

如果這沒有解決您的問題,請提供您的輸入文件hosts_file的樣本以及一些輸出日誌。

您還可以嘗試通過將腳本與set -xset +x連接起來以激活調試/跟蹤模式,以查看引擎蓋下發生了什麼。

+0

謝謝,但是在我推薦了@NagiosSupport的更改之後,我可以通過Nagios Web UI確認所有有問題的主機不是正確響應並且通知被禁用。 –