實作目标:
通過一台機器(暫且叫管理端伺服器)運作腳本,自動登入遠端多台用戶端,并 運 行腳本或指令。
環境需求:
1.各個機器都要開通NFS,并挂載管理端伺服器共享出的統一共享盤。
2.各個機器都要開通ssh服務。
3.腳本放在共享的目錄裡。
4.網絡通暢,遠端嘛,這是必須的了,呵呵。
腳本運作過程:
在管理伺服器上運作expect.sh,自動調用main.sh ,然後再調用monitor_fcs.sh。說明:monitor_fcs.sh是收集用戶端機器資訊的,類似收集資訊的腳本統一寫進main.sh裡,統一調用。
以下是腳本具體内容,用時根據實情做下客戶化就可以了,我這裡是在AIX系統裡寫的,收集光纖卡資訊的。經測試linux下也能用,monitor_fs.sh要根據自己的機器情況修改。
[root@localhost testexpect]# cat expect.sh
#!/usr/bin/expect
set timeout 300
# 替換你自己的使用者名
set user "root"
#替換你自己的登入密碼
set password "root"
# IP位址清單
set ip_addrs [list 192.168.227.128 192.168.227.130]
foreach IP $ip_addrs {
spawn ssh $user@$IP
expect {
"(yes/no)?" { send "yes\r";exp_send continue }
"password:" { send "$password\r";exp_send continue }
}
expect "#"
# 替換你要執行的指令
send "sh /sharebin/main.sh\r"
sleep 5
send "exit\r"
[root@localhost testexpect]# cat main.sh
#!/bin/ksh
path=$PATH
export path
workdir=/sharebin
if [ ! -d $workdir ]
then
echo "$workdir not exist."
else
cd $workdir
fi
/sharebin/monitor_fcs.sh >>monitor_fcs_log_`date +\%F`.log 2>&1
[root@localhost testexpect]# cat monitor_fcs.sh
host=`hostname`
#echo " Hostname Hardware ID Hardware Location Hardware WWN Status"
echo " "
fcs=`lsdev -C | grep fcs|awk '{ print $1 }'`
for i in $fcs
do
code=`lscfg | grep $i|awk '{ print $3 }'`
Networkadd=`lscfg -vl $i|grep Network|sed 's/\.\{8,\}/ /'|awk ' { print $3 }'`
fcstat -d $i >/dev/null 2>&1
if [ $? -eq 0 ]
then
stat='N'
else
stat='Y'
fi
echo "$host\t\t$i\t\t$code\t\t$Networkadd\t$stat"
done
還有一種實作方式是不用expect,因為這樣有明文密碼,不安全。隻使用ssh實作。不過要做public-key驗證,要不然每登入一台機器都要手動輸入密碼。用ssh的話把上文的expect.sh内容改成如下内容,其他不變,然後寫一個IP 的清單檔案,把要登入的IP都寫進去就好了,就是下文的ip_list.txt. 腳本内容如下:
user=root
echo " Hostname Hardware ID Hardware Location Hardware WWN Status" >>monitor_fcs_log_`date +\%F`.log 2>&1
echo "==================================================================================================================" >>monitor_fcs_log_`date +\%F`.log 2>&1
for i in `cat ip_list.txt`
do
ssh $i "/sharebin/main.sh"
done
[root@localhost testexpect]# cat ip_list.txt
192.168.227.128
192.168.227.129
192.168.227.130
192.168.227.131