带有交互式的编程对话---expect

expect不是默认的系统安装包,需要额外安装:

#检查时候安装
rpm -qa | grep expect

#安装
yum install expect

#搜索位置
which expect

主要命令

expect实现交互式变成对话,主要依赖于4个命令,这些命令都是expect这个包自带的。

  • spawn 要执行的命令
  • expect 等待命令提示信息的出现,也就是捕捉用户输入的提示。包含即可
  • send 向屏幕输入字符串。相当于出现提示后,手动输入的内容
  • interact/expect eof 其中interact的意思是执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。expect eof 与spawn对应表示捕获终端输出信息终止

使用expect命令的方法

  • 脚本在开头就标明使用expect这个库:#!/usr/bin/expect
  • 使用here文档嵌套在bash脚本中: /usr/bin/expect << eof text eof
  • 使用-c命令嵌套在bash脚本中: expect -c "内容",相关内容可能需要转义,比较麻烦
  • 将expect中的内容独立成脚本,在bash脚本中调用: expect file grgv

一些其他命令的说明

  • set 可以设置超时,同时也可以设置变量
  • timeout expect的超时等待时间,默认10s。-1表示永不超时
  • exp_continue 继续执行下面的匹配,有点循环的意思
  • \r 可以理解为回车,每个send后都需要加。目前还不知道是否可以被替代
  • $argc 统计位置参数数量
  • [lindex $argv 0] 脚本中的第一个参数,类似于bash中的$1,以此类推
  • puts 打印字符串,类似于echo
  • expect{...} 输入多行记录

实例1:简单正常使用

#!/usr/bin/expect -f

spawn ssh [email protected] 
expect {
"yes/no" {send "yes\r"; exp_continue}
"password:" {send "root_passwd\r"; exp_continue}

"]" {send "echo \$USER\r"}
}

expect "]"
send "ls\r"

#interact 
expect eof

实例2: 包含参数的使用

#!/usr/bin/expect 

#set login_ip "10.130.41.130"
#set login_user "root"
#set login_pass "root_passwd"

# 这里展现了两种参数格式
#set login_ip [lrange $argv 0 0]
set login_ip [lindex $argv 0]
set login_user [lrange $argv 1 1]
set login_pass [lrange $argv 2 2]

spawn ssh $login_user@$login_ip 
expect {
"yes/no" {send "yes\r"; exp_continue}
"password:" {send "$login_pass\r"; exp_continue}

"]" {send "echo \$USER\r"}
}

expect "]"
send "ls\r"

expect eof

实例3: 使用-c参数调用

#!/usr/bin/bash

expect -c "
spawn ssh [email protected] 'ls'
expect {
\"yes/no\" {send \"yes\\r\"; exp_continue}
\"password:\" {send \"root_passwd\\r\"}
}



#interact 
expect eof
"

实例4: 以文件的形式调用

#!/bin/bash

echo "要调用expect了啊,等着啊"

# 这里的文件路径使用的相对路径,expect脚本和当前脚本在同一个目录下
expect test_expect.sh
echo "调用完成了哦"

参考链接:

  1. https://www.cnblogs.com/regit/p/7985740.html
  2. https://www.cnblogs.com/lzrabbit/p/4298794.html
  3. https://www.cnblogs.com/taosim/articles/3785817.html

猜你喜欢

转载自blog.csdn.net/jjt_zaj/article/details/113055179