赞
踩
背景
有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互。
expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。如安装软件是时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况。
安装expect
安装依赖:yum install tcl -y
安装expect:Centos系统yum install expect -y或Ubuntu系统apt-get install expect -y
一些基本的expect命令
spawn :启动新进程,用于执行shell命令;
expect :从发起交互的命令的进程接受字符串,用于匹配我们预想的字符串;
send :用于向发起交互的命令的进程发送字符串;
interact:允许用户交互,即此命令后,交互将不会由expect进行,将交回给用户;
示例
#!/usr/bin/expect
set timeout 30
set host "192.168.200.221"
set username "root"
set password "123456"
spawn ssh $username@$host ls
expect "password" {send "$password\r"}
expect eof
interact
#!/usr/bin/expect:表示使用expect来解释该脚本。
set timeout 30:表示设置超时时间,这里是表示超时时间为30秒,默认为10秒,用于执行shell命令的时间,如果执行的shell命令时间较长(如传输文件),则需要设置长一点。
set username "root" :表示设置并定义了变量username,变量值为"root"。
spawn sshusername@username@host ls:表示使用spawn来执行ssh $username@$host ls命令,该命令只有在expect环境里才能执行,所以直接在命令行输入或没有安装expect则会报错,它的主要功能是给它后面的shell命令运行进程加了个壳,进行传递交互的内容,注意,如果用引号将变量引起,将可能导致错误extra characters after close-quote...,如果执行的命令需要用到引号,使用双引号,并使用\转义,但只适用于命令中只有一对引号的情况,如果出现多对引号,将会出现一些奇怪的错误,暂时不知道如何解决。
如ssh -l root 192.168.200.118 ‘mysql -uroot -p123456 -e "show datavases;"‘命令。只能先登录目标主机,再匹配root@ubuntu:~#,send发送命令。
#!/usr/bin/expect -f
set timeout -1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。