空調有時都會停掉,使得我不得不將所有的主機關機等待空調回復
如果一台一台關的話會太慢,所以得要開發一個 script 程式,只要執行這隻程式就會依照IP設定遠端關機。
第1步驟:
設定無需密碼即可登入遠端之帳號
在被控端 Server 建立帳號並設定密碼
#useradd poweroff
#passwd poweroff
備註:控制端 Server 最好之能用 "root" 身份才能使用遠端關機的 script,以下教學皆以 root 身份執行
在控制端 Server 上登入"root" 建立金鑰
#ssh-keygen -t rsa
以下訊息直接按 "Enter" 即可
完成後在 root 家目錄下的 ".ssh" 隱藏目錄中會有 "id_rsa" "id_rsa.pub" 這兩個檔案
#ls ~/.ssh/
id_rsa id_rsa.pub
將 id_rsa.pub 複製到被控端的 "poweroff" 使用者中的家目錄裡的 ".ssh" 隱藏目錄中,並改名成 "authoriezd_keys" 即可
#scp /root/.ssh/id_rsa.pub poweroff@192.168.1.100:/home/poweroff/.ssh/authorized_keys
備註:帳號新建立時在家目錄中並無 ".ssh" 這目錄,需使用者自行建立
(poweroff)$mkdir ~/.ssh
完成複製後請用 ssh 遠端登入確定不需密碼即可登入被控端
第2步驟:
將 poweroff 使用者加入 sudo 並不需使用密碼即可執行 root 指令,但需限制可使用之指令
編輯 sudoer 檔案,並加入以下文字
#visudo
...
...
..
poweroff ALL=(root) NOPASSWD:/sbin/shutdown, /bin/sync
..
..
說明:poweroff 使用 sudo 指令時,身份為 root 並不需要輸入密碼,但只能執行 shutdown 和 sync 指令
以上兩步驟完成後即可使用 ssh 指令下達被控端關機
如:
#ssh poweroff@192.168.1.100 'sudo /bin/sync;sudo /bin/sync;sudo /bin/sync;sudo /sbin/shutdown -h now'
第3步驟:
將遠端關機指令寫成 script 檔案
如果直接在 shell script 的檔案中直接打入"ssh poweroff@192.168.1.100 指令"時
它並不會像直接用 root 身份在終端機執行時可以不用密碼
在執行這隻 script 時它還是會詢問帳號密碼
以下分為兩部份
第1部份:
我們要需要安裝 expect 這套軟體來執行 "expext shell" 才能達到執行 script 時不詢問密碼
#vi remote.sh
#!/usr/bin/expect -f
set username "poweroff"
set password "1qaz&UJM"
set ipaddr "192.168.1.226"
set timeout -1
spawn ssh $username@$ipaddr /usr/bin/sudo /bin/sync;/usr/bin/sudo /bin/sync;
/usr/bin/sudo /bin/sync;
/usr/bin/sudo
/sbin/shutdown -h now
match_max 100000
expect eof
說明:
1. username:遠端帳號。
2. password:遠端密碼。
3. ipaddr:遠端IP位址。
4. timeout:設定命令超時時間。
5. spawn:所要執行的程式。
6. match_max:設定所收到的資料量大小。
第2部份:
另外再寫一個 script 檔案將所要關機的 Server IP 寫入檔案中
#vi shudownAll.sh
#!/bin/bash
network=192.168.1.
serverip=(100 20 15)
account=poweroff
for((i=0;i<${#serverip[@]};i++)) do ip=$network${serverip[$i]} ping -c 1 -w 1 $ip &> /dev/null && result=0 || result=1
if [ "$result" == 0 ];then
echo $ip" is UP."
search=`cat remote.sh | grep '192' | sed 's/^.*\ "//g' | sed 's/\".*$//g'`
cat remote.sh | grep '192' | sed 's/^.*\ "//g' | sed 's/\".*$//g' |sed -i 's/'$search'/'$ip'/g' remote.sh
/root/remote.sh
else
echo $network${serverip[$i]}" is DOWN."
fi
done
完成後將兩隻程式的的權限改為 "root" 身份才能執行
#chmod 700 shutdownAll.sh remote.sh
執行 shutdownAll.sh
#./shutdownAll.sh
備註:
完成以上步驟後執行程式會出現以下訊息
sudo: sorry, you must have a tty to run sudo
這時需編輯 sudoer 檔,將 Defaults requiretty 註解起來
#vi /etc/sudoers
..
..
..
#Defaults requiretty <== 在前面加 "#" 註解起來
..
..
就不會發生錯誤訊息了!!
說明:
執行 shutdownAll.sh 後會依照 "
serverip
" 中所設定的 ip 用 sed 指令將 "remote.sh" 中的 "ipaddr
",更換成 "serverip" 。之後只要在 shutdownAll.sh 裡,在 "serverip" 加入新的 ip 即可將遠端 server 關機
沒有留言:
張貼留言