首先说说我写这个脚本的目的是什么。
我需要批量登录到服务器上去执行一个检测环境的脚本。目标服务器没有相关脚本,所以需要先通过SCP拷贝到目标服务器,然后再通过SSH去执行脚本。但是服务器没有做免密,需要输入密码,所有通过expect来应答密码。
然后搜集所有日志。
以下是我的脚本,测试能用,已经再生产环境使用,没有问题。
就是个很简单的功能,网上教程很多,可以结合自己情况组合成很多功能

#!/bin/bash
#########################################################
# Function : Automatic password input ssh login and scp #
# Platform : Base Linux				                    #
# Version  : 1.0                                        #
# Date     : 2021-01-12                                 #
# Author   : mshing			                            #
# Contact  :                            #
# Company  : 		                                    #
# using    : bash check.sk                              #
#########################################################

SSH_USER="mshing"
SSH_PSWD="123456"
SSH_PROT="22"

CHECK_DATE=`date "+%Y_%m_%d_%H_%M_%S"`
cp base_check.sh ${CHECK_DATE}_base_check.sh
TMP_FILE=${CHECK_DATE}_base_check.sh
# create log file
mkdir ./check_log_${CHECK_DATE}
touch ./check_log_${CHECK_DATE}/${TMP_FILE}.log
LOG_FILE=./check_log_${CHECK_DATE}/${TMP_FILE}.log
SSH_IP=`egrep -o "^(\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\.){3}\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b" env_conf.ini` 
# ip 可以从其他文件获取,也可以直接放在这以数组的形式就行,或者以空格分开直接放在这。
CHECK_SCRIPT="/tmp/${TMP_FILE}"
scp_exec(){
expect << EOF
	set timeout -1
	spawn scp -r ${TMP_FILE} ${SSH_USER}@${i}:/tmp
	expect {
	    "password" {send "${SSH_PSWD}\r";}
	    "yes/no" {send "yes\r";exp_continue}
	}
	expect eof
EOF
}
ssh_exec(){
expect << EOF
        set timeout 10
        spawn ssh -p ${SSH_PROT} ${SSH_USER}@${i}
        expect {
                "yes/no" {send "yes\r"; exp_continue}
                "password" {send "${SSH_PSWD}\r"}
        }
        expect -re ".*\[\$#\]"
        send -- "bash ${CHECK_SCRIPT}\r"
        expect -re ".*\[\$#\]"
		send -- "rm -rf ${CHECK_SCRIPT}\r"
        expect -re ".*\[\$#\]"
        send "exit\r"
        expect eof
EOF											
}
for i in ${SSH_IP}
do
	scp_exec >> ${LOG_FILE} 2>&1
	ssh_exec >> ${LOG_FILE} 2>&1
done
rm -rf ${TMP_FILE}
echo "complete!"

当然,如果有免密,,事情就简单多了。 如果集群密码一致还好直接搞变量,如果不一致,需要和ip写一起,再awk切一下就得到密码也方便。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐