expect脚本自动化地执行linux环境下的命令行交互任务

expect命令安装

  • Ubuntu/Debian系统:sudo apt-get install expect
  • Redhat/Centos系统:sudo yum install expect -y 

expect脚本使用

expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。

此处以scp交互命令的脚本示例:

#!/usr/bin/expect  

# expect默认timeout为30S 
# 设置为-1默认无穷大
set timeout -1
# 获取日期与shell脚本获取方式不同
set DAY_Y [exec date +%Y%m%d]
set host [lindex $argv 0]  
set username [lindex $argv 1]  
set password [lindex $argv 2]  
set src_file [lindex $argv 3]  
set dest_file [lindex $argv 4]  
spawn scp $src_file $username@$host:$dest_file  
 expect {  
 "(yes/no)?"  
  {  
    send "yes\n"  
    expect "*assword:" { send "$password\n"}  
  }  
 "*assword:"  
  {  
    send "$password\n"  
  }  
}  
expect "100%"  
expect eof

代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为-1(默认30秒),如果在执行scp任务时遇到了代码中没有指定的异常,则在等待程序结束后该脚本的执行会自动终止。如果设置具体时间,可能会导致文件传输不完整,脚本就结束了

    从以上代码刚开始的几行可以看出,我为这个脚本设置了5个需要手动输入的参数,分别为:目标主机的IP、用户名、密码、本地文件路径、目标主机中的文件路径。如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:

./expect_scp 192.168.10.21 root 123456 /root/src_file /root/dest_file 

以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.10.21中的/root下,同时还将这个源文件重命名为dest_file。

    spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止。

    使用expect需要了解的一点是:用expect速度会比较慢,因为需要等待返回的数据,然后输入命令执行,没有ssh密钥登录的快速。

    安全性和速度上考虑建立信任关系都是最佳的方法,至于在具体的环境中选择什么根据实际情况来选择。

完整版SCP示例

 

scpmysqlbak.sh
 !/bin/expect

# expect默认timeout为30S 
# 设置为-1默认无穷大
set timeout -1 
set DAY_Y [exec date +%Y%m%d]
set old_file "/opt/mysqlbackup/month"
set new_file "/disk1/mysqlbackup/60_old_bak/"
set host "59.217.0.60"
set username "root"
set password "issBGT123."

spawn scp -r $username@$host:$old_file/database_bk_$DAY_Y/ $new_file
 expect {
 "(yes/no)?"
  {
    send "yes\n"
    expect "*assword:" { send "$password\n"}
  }
 "*assword:"
  {
    send "$password\n"
  }
}
expect "100%"
expect eof

 

start_scpmysqlbak.sh
 #!/bin/bash

nohup /disk1/mysqlbackup/60_old_bak/scpmysqlbak.sh 2>&1 &

 

posted @ 2026-01-22 12:09  阿尔法哲  阅读(7)  评论(0)    收藏  举报