expect 用来实现自动和交互式任务进行通信,而无需人的干预
依赖tcl,离线安装expect前需要提前安装tcl
cat test_expect.sh
#!/usr/bin/expect -f
#
set hostip "192.168.0.106"
set username "root"
set passwd "root1234"
spawn ssh $username@$hostip
expect {
"(yes/no)?" {send "yes\r";exp_continue}
}
expect "*assword:"
send "$passwd\r"
expect "~]$"
send "path=`pwd`\r"
expect "$"
send "echo \$path\r"
expect "$"
说明:
- 首行指定用来执行该脚本的命令程序
- 定义参数:
a. set hostip "192.168.0.106" 定义常量
b. 执行脚本时传递参数类似shell,如执行脚本时传入一个ip参数即为:set hostip [lindex $argv 0]
- 定义参数:
- spawn ssh hostip,spawn用来启动脚本和命令的会话,它用于启动一个进程,之后所有expect操作都在这个进程中进行。
- expect "*assword:",expect命令用于等候一个匹配输出,一旦匹配就执行后面的动作。
- send "path=
pwd
\r", send是expect中的动作命令,向进程发送输入内容,模拟用户输入。
- send "path=
- exp_continue:需处于expect的动作中,表示expect的匹配从头开始继续匹配。
- exit,close,wait:exit表示退出脚本,close表示立即关闭过程,而wait则是等待过程返回eof时关闭。
- interact:运行表示将控制权交给用户,与spawn生成的进程进行交互。由用户与spawn生成的进程进行交互,比如登录ftp服务器并下载的过程中,登录ftp服务器的过程可以由用户输入自己的用户名和密码,然后用户再输入q字符将控制权交给脚本,由脚本完成后面的交互动作。
- set timeout 30,设置超时时间,单位秒,不设置默认10秒,到了这个timeout,还是没有屏幕输出的话,expect脚本中下面的代码就会执行