Linux shell自动交互

Synopsis: shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力得多。有时候我们可能会需要实现和交互程序如fdisk、ftp、ssh、scp等进行交互的功能,这时候我们需要用到shell的自动交互功能。
1. 重定向
#!/bin/bash fdisk /dev/sda << EOF n p 1 +10G t 8e w EOF
2. 管道
#!/bin/bash echo "n p 1 +10G t 8e w" | fdisk /dev/sda
普通用户修改自己的密码:
#!/bin/bash passwd << EOF 旧密码 新密码 新密码 EOF
或者:
#!/bin/bash ( echo "旧密码" sleep 1 echo "新密码" sleep 1 echo "新密码" ) | passwd
如果是root用户执行脚本去修改普通用户的密码,可以使用--stdin
选项:
#!/bin/bash echo "新密码" | passwd --stdin 普通用户名
3. expect
expect是专门用于自动交互(automating interactive)
的命令,功能强大,基于Tcl脚本语言,但CentOS中默认没有安装:
# rpm -qa | grep 'expect' # yum -y install expect
3.1 使用介绍
expect
详细使用方法请参考man except
,它的常用指令如下:
(1) set
设置变量值
1. 设置expect永不超时 set timeout -1 2. 设置expect 300秒超时,如果超过300没有expect内容出现,则退出 set timeout 300 3. 获取命令行参数并赋值给变量,$argv 0对应命令行第一个参数,$argv 1对应命令行第二个参数,依次类推 set server [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2]
(2) spawn
调用要执行的脚本或程序命令,如ssh、scp、ftp、telnet等
1. 执行当前目录下的脚本 spawn ./questions.sh 2. 启动ssh远程连接 spawn ssh -l $user $server
(3) expect
等待spawn
指定的脚本或命令的输出
,即捕捉命令的提示信息,如果与expect
后面的字符串匹配,就返回下面的send
命令指定的响应字符串
命令的输出提示信息有可能会变化,所以可以在expect中使用模糊匹配,比如*
expect eof
表示脚本结束
(4) send
向当前expect进程发送响应字符串,替代用户手动输入内容
(5) interact
将当前进程的控制权交还给用户,允许用户使用键盘等输入设备进行交互。比如,远程登录后,让用户后续可以操作远程终端。
假设当前目录下有一个询问用户一些问题的脚本:
# vim questions.sh 内容如下: #!/bin/bash echo "Hello, who are you?" read $REPLY echo "Can I ask you some questions?" read $REPLY echo "What is your favorite topic?" read $REPLY
再创建一个自动应答的expect脚本:
# vim answerbot.exp 内容如下: #!/usr/bin/expect -f set timeout -1 spawn ./questions.sh expect "Hello, who are you?\r" send -- "Im Tom\r" expect "Can I ask you some questions?\r" send -- "Sure\r" expect "What is your favorite topic?\r" send -- "Technology\r" expect eof
赋予两个脚本可执行权限,然后执行answerbot.exp:
[root@CentOS ~
分享
相关推荐
作者

0 条评论
评论者的用户名
评论时间暂时还没有评论.