shell中的expect實現遠程登錄或者傳文件

場景爲:
一臺主機上執行腳本,修改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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章