Linux高阶—shell远程批处理脚本(七)

目录

介绍:简单、实用的批处理脚本

案例一:批量下发远程执行命令

案例二:批量下发文件


介绍:实用、简单的批处理脚本

expect是处理交互式命令的命令,它可以将类似ssh登录,ftp登录等等需要交互式的场景自动输入登录账号密码, 使其完成自动化运行。

案例一:批量下发远程执行命令

#Remote execution tool
vim remote.sh 

#!/bin/bash
_work_dir=/root/tmp
#Build workdir directory
    if [ ! -d ${_work_dir} ]
    then
        mkdir ${_work_dir}
    fi
_log_dir=${_work_dir}/log
#Build log directory
    if [ ! -d ${_log_dir} ]
    then
        mkdir ${_log_dir}
    fi
	
touch ${_log_dir}/check.log 
_check_msg=${_log_dir}/check.log

function info() {
    echo -e "\033[32m [INFO] \033[0m$@ "
}
function warn() {
    echo -e "\033[31m [WARN] \033[0m$@"
}

# LAN SERVERS
LANSERVER=(
192.168.31.214,test01
192.168.31.215,test02
) #填写IP与主机名
_REMOTE_UN="" #填写登入用户名
_REMOTE_PW="" #填写登入密码
_ROOT_PW=""  #填写root密码

echo -e "\033[36m+++Please enter the shell command to be executed+++\033[0m"
read -p "Command: " _CMD #输入需要执行的指令

# CHECK
for ((i=0; i< ${#LANSERVER[*]}; i++))
  do
   _REMOTE_IP=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $1}'`
   _REMOTE_NAME=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $2}'`
   
   if [ "$_ROOT_PW" = "" ]; then
      expect common_user.exp "${_REMOTE_NAME}" "${_REMOTE_IP}" "${_REMOTE_UN}" "${_REMOTE_PW}" "${_CMD}"
   else
      expect root_user.exp "${_REMOTE_NAME}" "${_REMOTE_IP}" "${_REMOTE_UN}" "${_REMOTE_PW}" "${_ROOT_PW}" "${_CMD}"
   fi
   
   if [ $? -eq 0 ];then
      info "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} *************  Command ************** [success]" |tee -a ${_check_msg}
   else
      warn "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} *************  Command ************** [failure]" |tee -a ${_check_msg}
      continue
   fi
  done

#remote common_user.exp
vim common_user.exp

#!/usr/bin/expect -f
set timeout 5

set host_name  [lindex $argv 0]
set host_ip    [lindex $argv 1]
set host_un    [lindex $argv 2]
set host_pw    [lindex $argv 3]
set CMD        [lindex $argv 4]

set login_flag 1

spawn ssh ${host_un}@${host_ip}

 expect {
   "yes/no" {send "yes\r"; exp_continue}
   "password:" {send "${host_pw}\r"}
   "Password:" {send "${host_pw}\r"}
 }
 expect {
   "${host_name}" {set login_flag 0 ;send "${CMD}\r"}
   expect eof
 }
send "exit\r"
expect eof
exit $login_flag


#remote root_user.exp
vim root_user.exp

#!/usr/bin/expect -f
set timeout 5

set host_name  [lindex $argv 0]
set host_ip    [lindex $argv 1]
set host_un    [lindex $argv 2]
set host_pw    [lindex $argv 3]
set root_pw    [lindex $argv 4]
set CMD        [lindex $argv 5]

set login_flag 1

spawn ssh ${host_un}@${host_ip}

 expect {
   "yes/no" {send "yes\r"; exp_continue}
   "password:" {send "${host_pw}\r"}
   "Password:" {send "${host_pw}\r"}
 }
 expect {
   "${host_name}" {set login_flag 0 ;send "su -\r"; exp_continue}
   "password:" {send "${root_pw}\r"}
   "Password:" {send "${root_pw}\r"}
 }
 expect {
   "*${host_name}*#" {set login_flag 0 ;send "${CMD}\r"}
   expect eof
 }
send "exit\r"
expect eof
exit $login_flag

执行结果如下:

20a1da42873f42b09b2af3200907994c.png

案例二:批量下发文件

vi scp_file.sh 
##################################################################
#!/bin/bash
_work_dir=/root/tmp
#Build workdir directory
    if [ ! -d ${_work_dir} ]
    then
        mkdir ${_work_dir}
    fi
_log_dir=${_work_dir}/log
#Build log directory
    if [ ! -d ${_log_dir} ]
    then
        mkdir ${_log_dir}
    fi
	
touch ${_log_dir}/check.log 
_check_msg=${_log_dir}/check.log

function info() {
    echo -e "\033[32m [INFO] \033[0m$@ "
}
function warn() {
    echo -e "\033[31m [WARN] \033[0m$@"
}

# LAN SERVERS
LANSERVER=(
192.168.31.214,test01
192.168.31.215,test02
) #填写IP与主机名
_REMOTE_UN="luojie" #填写登入用户名
_REMOTE_PW="123456" #填写登入密码
_SRC_FILE="1.txt" #填写源文件
_DST_FILE="/tmp/1.txt" #填写目的文件

echo -e "\033[36m+++ shell SCP to be executed+++\033[0m"
# CHECK
for ((i=0; i< ${#LANSERVER[*]}; i++))
  do
   _REMOTE_IP=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $1}'`
   _REMOTE_NAME=`echo "${LANSERVER[$i]}" |awk -F ',' '{print $2}'`
   
   expect myscp.exp "${_REMOTE_NAME}" "${_REMOTE_IP}" "${_REMOTE_UN}" "${_REMOTE_PW}" "${_SRC_FILE}" "${_DST_FILE}"
   
   if [ $? -eq 0 ];then
      info "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} *************  SCP ************** [success]" |tee -a ${_check_msg}
   else
      warn "`date +'[%Y-%m-%d %H:%M:%S]'` Check ${_REMOTE_IP} *************  SCP ************** [failure]" |tee -a ${_check_msg}
      continue
   fi
  done

#################################################################
vi myscp.exp

#!/usr/bin/expect -f
set timeout 5

set host_name  [lindex $argv 0]
set host_ip    [lindex $argv 1]
set host_un    [lindex $argv 2]
set host_pw    [lindex $argv 3]
set src_file   [lindex $argv 4]
set dst_file   [lindex $argv 5]

spawn scp ${_src_file} ${host_un}@${host_ip}:${_dst_file}

 expect {
   "yes/no" {send "yes\r"; exp_continue}
   "password:" {send "${host_pw}\r"}
   "Password:" {send "${host_pw}\r"}
   expect eof
 }
send "exit\r"
expect eof

执行结果:

a4bdbb5405954e83b53d29e8599f6fde.png

上一篇:Linux高阶—shell脚本编程基础(六)

下一篇:Linux高阶—shell脚本企业实战(八)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值