標籤:linux 伺服器 bash awk shell
實驗室有一個伺服器放在機房,裝的是Ubuntu Server,IP為自動分配,因此一旦IP有變化就無法遠程操作,必須去機房記錄新的IP。學了幾天Shell之後想,是不是可以定時檢測其IP的變化,一旦有變化就發送到郵箱呢?。首先分析一下這次任務,無非是幾塊內容:
1、查詢當前IP;
2、查詢變化前的IP;
3、如二者不想等則,讀取郵件清單;
4、對列表發送郵件;
4. 定時執行指令碼;
當然,在學校的上網認證系統大行其道的環境下又加了一條,那就是自動登陸上網認證系統,這又是後話了。
首先是查詢當前IP,會點Linux的童鞋們應該對ifconfig不陌生,輸入一下得到:
eth0 Link encap:乙太網路 硬體地址 00:30:48:f9:b7:18
inet 地址:223.2.36.217 廣播:223.2.47.255 掩碼:255.255.240.0
inet6 地址: fe80::230:48ff:fef9:b718/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 躍點數:1
接收資料包:439851 錯誤:0 丟棄:0 過載:0 幀數:0
發送資料包:410241 錯誤:0 丟棄:0 過載:0 載波:0
碰撞:0 發送隊列長度:1000
接收位元組:76752373 (76.7 MB) 發送位元組:177467784 (177.4 MB)
中斷:16 Memory:faee0000-faf00000
lo Link encap:本地環回
inet 地址:127.0.0.1 掩碼:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 躍點數:1
接收資料包:583701 錯誤:0 丟棄:0 過載:0 幀數:0
發送資料包:583701 錯誤:0 丟棄:0 過載:0 載波:0
碰撞:0 發送隊列長度:0
接收位元組:179155467 (179.1 MB) 發送位元組:179155467 (179.1 MB)
但是我只要其中IP,對於其他一大堆東西不感興趣,那怎麼辦。這下就需要我們的grep登場了,grep是文本尋找的“高手”,支援Regex,它將會返回結果的行。我們觀察到我們需要的IP:223.2.36.217的行前面為“inet 地址”,於是我們可以grep "inet 地址"。這樣就剩下兩行了:
inet 地址:223.2.36.217 廣播:223.2.47.255 掩碼:255.255.240.0
inet 地址:127.0.0.1 掩碼:255.0.0.0
但是還有兩行,於是我們可以使用grep -v "127.0.0.1" 反向選擇刪除localhost,就只剩我們目標行了。
接下來是要擷取列,我們觀察到目標行分隔是通過:和空格分的,所以咱使用下一個工具,cut,使用cut -d: -f2用:和空格分隔,擷取從第二列開始的數組,這就擷取了IP。最後使用awk ‘{print $1}‘將值賦予IP,於是形成完整的IP擷取:
IP=`ifconfig|grep ‘inet 地址‘|grep -v ‘127.0.0.1‘|cut -d: -f2|awk ‘{print $1}‘`
那怎麼知道IP有沒有變化呢?我的做法就是第一次的時候把IP記錄下來,即echo "$IP">IP_CONF,IP_CONF為一個叫ip.conf的檔案,每次讀這個檔案就知道之前的ip了,接下來就是郵件清單,記錄net-report.conf,要發郵件的時候從它們裡面讀取,並發送郵件:
cat $MAIL_LIST|while read mailist
do
echo "Sending mail to $mailist"
echo "New IP is:$IP"|mail -s newIP $mailist
done
這就基本完成了, 但是多說一句,首先發送郵件得確定安裝sendmail或mailutils,並在/etc/host裡面改一下網域名稱。你收到的郵件地址會是你的“使用者名稱@網域名稱”,另外對外網郵箱,現在大多有設定反垃圾機制,嘗試了一下qq郵箱和新浪郵箱,均被攔截了。想要收到郵件得設定白名單。
最後是怎麼定時執行shell,使用crontab吧,具體的看我轉載的文章http://blog.csdn.net/kaixin89/article/details/45199003
下面給出完整的指令碼:
#!/bin/bashIP_CONF='ip.conf'MAIL_LIST='net-report.conf'IP=`ifconfig|grep 'inet 地址'|grep -v '127.0.0.1'|cut -d: -f2|awk '{print $1}'`if [ ! -d $IP_CONF ]then touch $IP_CONFfi#ip is newestOLD_IP=`cat $IP_CONF|grep [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*`echo "IP:$IP OLD_IP:$OLD_IP"if [ -z "$OLD_IP" ] || [ "$OLD_IP" != "$IP" ] then echo "$IP">$IP_CONF cat $MAIL_LIST|while read mailist do echo "Sending mail to $mailist" echo "New IP is:$IP"|mail -s newIP $mailist donefi
用自動化的方式解決最實際的問題,雖然還是很菜,但是很有成就感啊
Linux下Shell實現伺服器IP監測