免交互Here Document和EXPECT
Here Document
Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序,当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。
使用Cat和EOF多行输入
cat >> /root/test.txt <<EOF
hello
hello word
world
EOF
示例:
#EOF写本地yum源(镜像挂载mnt下)
[root@localhost ~]# cat > wpc.repo <<EOF
>[wpc]
>name=wpc
>baseurl=file:///mnt
>enabled=1
>gpgcheck=0
>EOF
#给wpc用户修改密码
[root@localhost ~]# passwd wpc <<EOF
>971125
>971125
>EOF
Expect
建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题
使用expect需要依赖tcl语言,所以需要优先安装tcl和expect
yum -y install expect #安装
rpm -q tcl #检查安装
rpm -q expect #检查安装
-
使用expect编写脚本解释器需设置为#!/usr/bin/expect
-
spawn后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息
示例:
spawn passwd root
- 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由spawn启动的进程的输出;用于接收命令执行后的输出,然后和期望的字符串匹配。
- send向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r (回车)或者\n
示例:
expect "获取帮助" {send "n\r";}
-
结尾结束符expect eof,表示交互结束,等待执行结束,退回到原用户,与spawn对应,比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户
-
interact执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,
interact后的命令不起作用
注: expect eof与interact只能二选一
- set,expect默认的超时时间是10秒,通过set命令可以设置会话超时时间,若不限制超时时间则应设置为-1。
示例:
set timeout 30
示例:
#免交互划分磁盘
#!/usr/bin/expect
set user [lindex $argv 0] #参数引入
spawn fdisk $user #追踪
expect "获取帮助" {send "n\r";} #实现免交互,发送内容
expect "Select" {send "p\r";}
expect "分区号" {send "\r";}
expect "起始 扇区" {send "\r";}
expect "Last 扇区" {send "+10G\r";}
expect "已设置为 Linux 类型" {send "w\r"}
expect eof #结束符