在Linux 编程中有时我们会用到shell脚本来帮我们做一些事情,但涉及到交互中需要人为交互的部分如果想自动化运行就比较麻烦,但shell操作中其实是考虑到这点的。下面我以一个例子来简要的说明,当然网上有很多相关的描述,只是信息较杂乱,不够直接明了。
#首先介绍一下用到的命令:expect
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
选项
-c:从命令行执行expect脚本,默认expect是交互地执行的
示例:expect -c 'expect "\n" {send "pressed enter\n"}'
-d:输出调试信息
示例:expect -d ssh.exp
expect中的相关命令
spawn:启动新的进程
send:向进程发送字符串
expect:从进程接收字符串
interact:允许用户交互
exp_continue 匹配多个字符串时在执行动作后加此命令
expect最常用的语法(tcl语言:模式-动作)
单一分支模式的语法:
expect "hi" { send "You said hi\n" } 匹配到 hi 后,会输出"you said hi",并换行
多分支模式的语法:
expect "hi" { send "You said hi\n" } \ "hehe" { send “Hehe yourself\n" } \ "bye" { send "Goodbye\n" }
匹配 hi, hehe, bye 中的任意字符串时, 发送相应字符串。等同于:
expect { "hi" { send "You said hi\n" } "hehe" { send "Hehe yourself\n" } "bye" { send "Goodbye\n" } }
#expect安装:
根据你的系统不同,执行不同命令即可,简单这就不描述了。例如:yum -y install expect
OK,到这里是不是有点不耐烦了。。。接下来直接上一个例子,马上上手。。。。
#expect使用:
先来看一个场景:
此场景是需要使用 adduser 命令添加一个用户。期间需要用户交互的输入密码及确认密码的操作,这种在自动运行过程中认为不能干预,如果我们想系统自动化运行只能依靠脚本实现。
接下来看实现此功能的脚本
#!/usr/bin/expect
#创建用户命令:adduser ftp
#匹配password:字符串,然后输入123456\n exp_continue 表示可以多次匹配就需要用到
set timeout 30
spawn adduser ftp
expect {
"password:" { send "123456\n";exp_continue }
}
spawn adduser nobody
expect {
"password:" { send "123456\n";exp_continue }
}
expect eof
这里用到了 #!/usr/bin/expect 解释;"password:" 就是我们期望匹配的字符。send 用于匹配期望后发送用户的输入,这里也就是我们的密码;是不是很简单。。。
创作不易,您的点赞+收藏是对我最大的支持
更多推荐
交互式shell脚本实操
发布评论