Linux下netstat 的script

我有一個需求,不知道怎麼達成,是否有人可以幫忙呢?

我的主機是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
2019-09-03 10:01 發佈



shell命名為xxx.sh

使用方式
./xxx.sh 15000.txt


這shell只能處理一個ip一個connection
一個ip 有數個connection的話, 就sort uniq, 自己改吧
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
slash410 wrote:
cat $1|wc ...(恕刪)


感謝你,明白了,原來我自己有打錯
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?