参考于:http://www.nginx.cn/1934.html
先安装expect
CentOS: yum install expect
Ubuntu: apt-get install expect
#!/usr/bin/expect
set timeout 30
spawn ssh user@localhost
expect {
"(yes/no)" {
send "yes\r"; exp_continue
}
"*assword" {
send "123456\r"
}
}
spawn ls
expect eof
#interact
expect使用的是TCL语法。
一条Tcl命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的是命令参数 cmd arg1 arg2 arg3
set timeout 30: 设置超时 单位是秒。 -1为永不超时
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。
interact: 执行后处于交互状态。
expect eof: 与spawn对应表示捕获终端输出信息终止,类似于if….endif.
#!/usr/bin/expect
# script name : testExpect.sh
set timeout 30
set host localhost
set username user
set password 123456
set src_file [lindex $argv 0]
set dest_file [lindex $argv 1]
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
在命令行执行 ./testExpect.sh testExpect.sh /home/user/expect.sh
$符号代表变量的值. 在本例中, $username@$host:$dest_file.
$argv 0: 从命令行读取第一个参数 本例中 testExpect.sh
$argv 1: 从命令行读取第二个参数 本例中 /home/user/expect.sh
方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外一个命令的参数, 那么你使用这个符号 [cmd arg]
双引号把词组标记为命令的一个参数. “$”符号和方括号在双引号内仍被解释 “some stuff”
大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解释 {some stuff}
反斜线符号是用来引用特殊符号. 例如:n 代表换行. 反斜线符号也被用来关闭”$”符号, 引号,方括号和大括号的特殊含义
expect 调用shell命令
Conf
USER=user1
PASS=123456
a.exp
#!/usr/bin/env expect
set PASS [ exec grep "PASS" Conf | cut -d= -f2 ]
puts $PASS