本章结构
Here Document免交互
Here Document常规用法
Expect基本命令
Expect执行方式
Expect案例
[root@localhost~]# cat <<EOF
> hello
> world
> EOF
hello
world
[root@localhost~]# cat <<xxx //自定义标识符
> hello
> xxx
hello
编辑本地yum源配置文件
[root@localhost~]# cat > yum.repo <<EOF
> [test]
> name=test
> baseurl=file://mnt
> enabled=1
> gpgcheck=0
> EOF
[root@localhost~]# cat yum.repo
[test]
name=test
baseurl=file:///mnt
enabled=1
gpgcheck=0 如果需要新增文件可以用>>追加
注:> 一个则覆盖 >>两个则是追加
[root@localhost~]# cat > yum.repo <<EOF
> hello
> EOF
[root@localhost~]# cat yum.repo
hello
[root@localhost~]# cat > yum.repo <<EOF
> world
> EOF
[root@localhost~]# cat > yum.repo
hello
world
[root@localhost~]# passwd zhangsan <<EOF
> 123
> 123
> EOF 更改用户zhangsan 的密码
EOF前面加-,屏蔽制表符,直接输出内容
[root@localhost~]# aa=$(cat <<EOF //变量替换
> 20
> EOF
> )
[root@localhost~]# echo $aa
20 10
[root@localhost~]# aa=$(cat <<'EOF' // 关闭替换变量
20
$a
EOF
)
Here Document使用注意事项
- 标记可以使用任意合法字符
- 结尾的标记一定要顶格写,前面不能有任何字符
- 结尾的标记后面也不能有任何字符(包括空格)
- 开头标记前后的空格会被省略掉
Here Document免交互
- 通过read命令接收输入并打印
- [root@localhost -]# vim here_non_interactive_read.sh
[root@llocalhost -]# vim here_non_interactive_passwd.sh#/bin/bash
passwd jerry <<EOF
This_is password
This_is_password
EOF
[root@locallhost -]J# chmod +x here_non_interactive_passwd.sh[root@localhost -J# .Jhere_non_interactive_passwd.sh
注:passwd命令需要的密码和确认密码
Expect概述
Expect
- 建立在tcl之上的一个工具
- 用于进行自动化控制和测试
- 解决shell脚本中交互相关的问题
Expect安装
- 挂载光盘
- 制作本地YUM源
- 执行安装命令
[root@localhost ~]# yum -y install expect
[root@localhost~]# rpm -qalgrep expect
expect-5.45-14.el7_1.x86_64
[root@localhost ~]# rpm -qalgrep tcl
tcl-8.5.13-8.el7.x86_64
基本命令
expect
- 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
- 只能捕捉由spawn启动的进程的输出
- 用于接收命令执行后的输出,然后和期望的字符串匹配
send
- 向进程发送字符串,用于模拟用户的输入
- 该命令不能自动回车换行,一般要加\r (回车)
其中\r 相当于回车键
停留在211这个节点上,等待管理员操作
引用位置变量
set user root
set ip lindex $argv 0 //设置第一个位置变量为ip
set pass [lindex $argv 1] //设置第二个位置变量为登录密码
# 超时时间
set timeout 20 //登录超时多少秒退出
#开启日志文件
log_file test.log //日志记录操作
#显示信息
log_user 1 //1为屏幕输出信息,0为不输出
expect -c “
spawn ssh root@192.168.94.100
expect \"password:\" { send \"123456\r\" }
expect \"]#\" { send \"ificonfig ens33\r\" }
expect \"]#\" { send \"exit\r\" }
expect eof
"
set
- 设置超时时间,过期则继续执行后续指令
- 单位是秒
- timeout -1表示永不超时
- 默认情况下,timeout是10秒
exp_continue
- 允许expect继续向下执行指令
send_user
- 回显命令,相当于echo
接收参数
- Expect脚本可以接受从bash传递的参数
- 可以使用[lindex $argv n]获得
- n从0开始,分别表示第一个,第二个,第三个…参数