場景爲:
一臺主機上執行腳本,修改ip.txt文件中所有主機的/etc/ssh/sshd_config文件內容
涉及的要點爲:scp命令的使用,expect命令"或"的使用,expect遠程執行腳本的使用
changeme_sshdconfig.sh
#! /bin/bash
CURRENT_PATH=$(cd `dirname $0`; pwd)
LOG_PATH=$CURRENT_PATH/logs/upgrade
echo "please input paas password:"
read -s paaspwd
echo "please input root password:"
read -s rootpwd
function scp_script_to_slave() {
#定義接收參數
local ipaddr=$1
local localfile="Change_sshd.sh"
local pword=$2
local rootpwd=$3
#利用expect自動拷貝文件到遠程服務器,兩種情況,第一次連接時:生成祕鑰,需要輸入yes;第二種情況:已生成過祕鑰,不需要輸入yes
expect <<EOF
set timeout 1000
spawn scp ${localfile} paas@${ipaddr}:/home/paas
expect {
"(yes/no)?" {
send "yes\r"
expect "*word"
send "${pword}\r"
}
"*word:" {
send "${pword}\r"
}
}
expect "*~" {send "exit\r"}
EOF
}
function execute_for_all_nodes(){
local ip=$1
local cmd=$2
local paaspwd=$3
local rootpwd=$4
# 遠程paas用戶登錄,切換到root執行命令
expect <<EOF
set timeout 3
spawn ssh paas@${ip}
expect "*word:" {send "${paaspwd}\r"}
expect "*~" {send "su - root\r"}
expect "*word:" {send "${rootpwd}\r"}
expect "*~" {send "${cmd}\r"}
expect "*~" {send "exit\r"}
expect "*~" {send "exit\r"}
expect "*~" {send "exit\r"}
EOF
}
function get_ips() {
cd $CURRENT_PATH
remotefile="/home/paas"
cat ip.txt | while read line
do
scp_script_to_slave $line $paaspwd $rootpwd
done
}
function execute_cmd() {
cd $CURRENT_PATH
cat ip.txt | while read line
do
execute_for_all_nodes $line "/bin/bash /home/paas/Change_sshd.sh" $paaspwd $rootpwd
done
}
get_ips
execute_cmd
Change_sshd.sh
#! /bin/bash
CURRENT_PATH=$(cd `dirname $0`; pwd)
LOG_PATH=$CURRENT_PATH/logs/upgrade
function change_sshd_config() {
sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -i 's/AllowUsers/AllowUsers root/g' /etc/ssh/sshd_config
sleep 1
service sshd restart
if [ $? -eq 0 ];then
echo "change sshd_config success!"
else
echo "change sshd_config failed!"
fi
}
change_sshd_config
ip.txt
8.7.81.xx
8.7.81.xx
8.7.81.xx