我有一個需求,不知道怎麼達成,是否有人可以幫忙呢?
我的主機是Centos 6,上面有跑一些程式,有固定的TCP port,遠端要被監控的主機有安裝agent,會連線到我們主機來,但有時候不知道為什麼agent會有問題,導致沒有和我設備連線。
我想寫一各script去監控netstat連線不見時,就用email告警。
我的設備假設會LISTEN TCP 15000和TCP 18000
然後我有一各txt的文字檔,檔名15000.txt,這檔案的IP會和我設備的15000 port連線
例如
1.1.1.1
1.1.1.2
1.1.1.3
另外一各檔名18000.txt,裡面的IP會和我設備的18000 port連線
例如
2.2.2.2
2.2.2.3
2.2.2.4
這script目錄就是去判斷netstat資訊,沒有檔案內的IP存在時,email給abc@test.com,若是IP存在,則不做任何事。
然後我自己會利用crontab去排程每五分鐘執行一次。
若是用netstat去察看,會顯示如下 (192.168.254.31是我的設備)
tcp 0 0 192.168.254.31:15000 1.1.1.1:10204 ESTABLISHED
tcp 0 0 192.168.254.31:15000 1.1.1.2:33204 ESTABLISHED
tcp 0 0 192.168.254.31:15000 1.1.1.3:55627 ESTABLISHED
tcp 0 0 192.168.254.31:18000 2.2.2.2:42430 ESTABLISHED
tcp 0 0 192.168.254.31:18000 2.2.2.3:22400 ESTABLISHED
tcp 0 0 192.168.254.31:18000 2.2.2.4:12450 ESTABLISHED
slash410 wrote:
shell命名為xxx...(恕刪)
感謝你,我用你的內容,加以修改了一下,但結果不太正確。
我執行語法為./xxx.sh list.txt,得到結果是SEND MAIL
我要看的port是10066 port,所以netstat那邊,我有用grep 10066先去挑出來全部,然後後面在配合刪掉多組的session
我若單獨執行
netstat -an|grep 10066 | awk '{print $5}' | cut -d: -f1 | grep -v 0.0.0.0| sort | uniq | sort -n
結果會顯示
192.168.254.16
192.168.50.45
------------------------------------------------------------------------------------
list.txt內容如下(這檔案的目的就是我要監控的IP清單,實際上這檔案內的IP,必須要一直跟我的10066 port保持連線,只要實際的連線中,少了某一個IP,就要email通知使用者,哪一個IP不見了,需要檢查,例如check 192.168.254.16)
192.168.254.16
192.168.50.45
----------------------------------------------------------------------------------------
我貼上我的xxx.sh
#/bin/sh
fileline=`cat $1|wc -l`
temp=0
while read line; do
temp=`netstat -an|grep 10066 | awk '{print $5}' | cut -d: -f1 | grep -v 0.0.0.0| sort | uniq | sort -n|grep $line:|wc -l`
((resultcount=resultcount+temp))
done < $1
if [ $resultcount != $fileline ]; then
echo "SEND MAIL"
fi
----------------------------------------------------------------------------------------
我有在上面的語法中,插入echo $resultcount
#/bin/sh
fileline=`cat $1|wc -l`
temp=0
while read line; do
temp=`netstat -an|grep 10066 | awk '{print $5}' | cut -d: -f1 | grep -v 0.0.0.0| sort | uniq | sort -n|grep $line:|wc -l`
((resultcount=resultcount+temp))
done < $1
#下面是我自己加入
echo $resultcount
if [ $resultcount != $fileline ]; then
echo "SEND MAIL"
fi
結果是
0
SEND MAIL
chtois wrote:
感謝你,我用你的內容...(恕刪)
cat $1|wc -l 是在算你丟進來的檔案的"行數"
所以也可以把它印出來,看是不是跟你預想的一樣
netstat -an|grep 10066 | awk '{print $5}' | cut -d: -f1 | grep -v 0.0.0.0| sort | uniq | sort -n|grep $line:|wc -l
你寫的這段是錯的
注意看我之前寫的..
while read line .... < $1 這是依照你丟進來的檔案"$1" , 一行一行去做甚麼..
你可以印出 $line , 就知道了
我原本的shell script
netstat -na | awk {'print $5'} 是要列出有連接上的IP跟port , 所以會看到
1.1.1.1:xxxxx
2.2.2.2:xxxxx
然後grep $line:
就是依照丟進來的檔案的每一行去grep, 且加上":"
正常來講找到就是1, 沒找到就是0 (也就是temp)
然後resultcount再把上面的值加總起來
最後就是跟丟進來的檔案行數比較
不一樣就是SEND MAIL
內文搜尋

X