自動連接多台機器並搜尋日志的腳本
我們應用部署在10台機器上,對應地日志文件也分散在這10台上。若想從這10份日志文件中,搜索,如報錯信息,是比較常見的需求。
下面的腳本干的就是這事兒。大體邏輯十分簡單:
Pseudocode:
for hostname in (10台機器):
ssh連接遠程host
從日志文件中找出符合條件的行並寫到本地文件中
看似簡單,但對於shell編程生疏的我來講,有以下兩個難點:
1. 如何ssh時,不需要手動輸入passphase/password
2. 如何結束當前ssh session後,繼續開啟下一個ssh session
google了半天,運氣算好,搞定了,解決方案如下:
1. 如何ssh時,不需要手動輸入passphase/password?
用ssh-agent!此進程啟動後,只需手動輸入passphase一次,則ssh-agent就會記住你的passphase,後面連接遠程機子時,它會自動從記憶中讀取,不需要人為再次輸入了。
環境設置如下:
1) 生成public/private key pairs:
$ssh-keygen -t dsa
2) 把生成的public key (id_dsa.pub)放到10台遠程機器上
$scp .ssh/id_dsa.pub username@hostname:.ssh/authorized_keys (10次)
3) 確保ssh-agent已啟動,若無,則啟動:
$ps aux | grep ssh-agent #check if it`s running
$eval `ssh-agent` #if not, start up the agent process
4) 向ssh-agent提交你的passphase:
$ssh-add
5) 把ssh-agent相關信息保存到變量中,以便在執行腳本時導入引用:
$ssh-agent -s > ~/.bashrc
6) 腳本中記得引入變量即可,如:
$source ~/.bashrc
2. 如何結束當前ssh session後,繼續開啟下一個ssh session?
<<"EOF"
EOF
具體原理,後面再補充!
到此,整個可執行腳本就出來了。再在crontab -e裡寫上一行,輕輕松松讓它每天自動收集報錯信息並發郵件給俺!
腳本附上,寫得實在是粗陋,隨便嫌棄哈,不用對我客氣!
順便,若有更簡潔的解決方案,求不吝賜教!
#!/bin/bash
source ~/.bashrc
hostfile="/home/bai/host_videoapi" #一機器一行
keyword="fail@" #查詢的關鍵字
search_log="videoapi.log" #查尋的日志文件名
outputfile="error_videoapi.log" #output file
#挨個兒連接並搜尋錯誤信息
while read line
do
vahost=$line
echo "---hostname:" $vahost "-----" >> $outputfile
ssh $vahost "find /home/videoapi/logs -type f -name $search_log -exec grep -i $keyword {} \; -print " >> $outputfile <<"EOF"
EOF
echo "---finishing-----"
done < $hostfile
#查看是否有錯誤信息,有則發郵件,無則done nothing
if grep -q $keyword $outputfile
then
mail -s "errors in videoapi!"
[email protected] < $error_log
else
echo "it is a nice day!"
fi