在Shell编程中,expect
是一个强大的工具,它基于Tcl语言开发,主要用于自动化交互式程序的控制。当执行脚本时遇到需要用户输入的情况(如SSH登录、密码验证或其他等待输入的命令行程序),可以使用expect
来模拟这些交互过程,从而实现非交互式的自动化执行。
以下是expect
的基本用法和关键命令:
-
安装expect: 在支持yum的Linux系统中,可以通过以下命令安装:
sudo yum -y install expect
-
编写expect脚本的基本结构
#!/usr/bin/expect # 启动一个子进程并追踪其输出 spawn command [arguments] # 预期捕获到特定字符串 expect "expected_string" # 根据捕获的内容发送相应的输入 send "input_string\r" # 可以重复以上步骤进行多轮交互 ... # 退出spawn启动的子进程 expect eof
spawn: 启动一个新的进程(如ssh、telnet等)并与之交互。 expect: 等待指定的模式出现,该模式可以是正则表达式。 send: 发送文本到当前spawn的进程中,\r 表示回车。 exp_continue: 如果期望的模式匹配成功,则继续等待下一个期望,不退出脚本。 interact: 当所有预定义交互完成后,允许人工接管控制台。 eof: 等待子进程结束。
-
示例用法:
#!/bin/bash for i in `seq 23 128` do num=`echo $i|awk '{printf("%03d\n",$0)}'` /usr/bin/expect << EOF set timeout 30 spawn scp -r kwd-ww test@test$num:/opt/ul/kwd-ww_new spawn cp /opt/ul/kwd-ww/bin/license_94.dat /opt/ul/kwd-ww/bin/license.dat\ /opt/ul/kwd-ww/bin/license_speechid.dat /opt/ul/kwd-ww_new/kwd-ww/bin\ && mv /opt/ul/kwd-ww /opt/ul/kwd-ww_20230210\ && mv /opt/ul/kwd-ww_new/kwd-ww /opt/ul expect { "*yes/no" { send "yes\r";exp_continue } "*password:" { send "test@123$%^\r" } } expect eof EOF done
以下是优化的版本
#!/bin/bash password="test@123$%^" auto_answer="yes\r" for i in $(seq 23 128); do num=$(printf "%03d" $i) /usr/bin/expect << EOF set timeout 30 spawn bash -c "scp -r kwd-ww test@test${num}:/opt/ul/kwd-ww_new && \ ssh test@test${num} 'cd /opt/ul/kwd-ww_new/kwd-ww/bin && \ cp /opt/ul/kwd-ww/bin/license_94.dat license.dat && \ cp /opt/ul/kwd-ww/bin/license_speechid.dat . && \ cd /opt/ul && mv kwd-ww kwd-ww_20230210 && \ mv kwd-ww_new/kwd-ww .'" expect { "*yes/no*" { send "$auto_answer"; exp_continue } "*password:" { send "$password\r" } } expect eof EOF done