目录
3.5.再使用 send 发送需要交互输入的字符串,结尾需要加上回车符
一.Here Document免交互
1.Here Document概述
- 使用I/O重定向的方式将命令列表提供给交互式程序
- 标准输入的一种替代品
- 语法格式
命令 <<开始标记
...
...
结尾标记
2.Here Document使用注意事项
- 标记可以使用任意合法字符
- 结尾的标记一定要顶格写,前面不能有任何字符
- 结尾的标记后面也不能有任何字符(包括空格)
- 开头标记前后的空格会被省略掉
3.Here Document运用
3.1.通过read命令接收输入并打印
[root@localhost ~]# read a <<EOF
> zx like xiaojiejie
> EOF
[root@localhost ~]# echo $a
zx like xiaojiejie
3.2.wc -l的内容行数统计
[root@localhost ~]# wc -l <<EOF
> abc
> 123
> xyz
> 567
> EOF
4
3.3.passwd用户密码的修改
[root@localhost ~]# passwd zhangsan <<EOF
> abc12345
> abc12345
> EOF
3.4.cat查看内容
3.5.tee重定向输出加标准输出
原文件内容
[root@localhost ~]# vim test3.txt
[root@localhost ~]# tee test3.txt <<EOF
> zx like xiaomeimei
> EOF
zx like xiaomeimei
[root@localhost ~]# cat test3.txt
zx like xiaomeimei
二.Here Document变量使用
1.交互内容输出变量
[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[root@localhost day20]# cd /opt/
[root@localhost opt]# ls
local.repo rh
#!/bin/bash
file_path=/opt/local.repo
repo_path=/mnt
cat <<EOF > $file_path
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF
1.1.支持变量替换
[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[root@localhost day20]# cd /opt/
[root@localhost opt]# ls
base.repo demo1.sh local.repo rh
#!/bin/bash
file_path=/opt/base.repo
repo_path=/data
cat <<EOF > $file_path
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF
1.2.输出
[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[local]
name=local
baseurl=file:///data
enabled=1
gpgcheck=0
#!/bin/bash
file_path=/opt/base.repo
repo_path=/data
cat <<EOF
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF
2.交互内容中不输出变量
[root@localhost day20]# vim demo1.sh
[root@localhost day20]# bash demo1.sh
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
2.1.加单引号
#!/bin/bash
file_path=/opt/base.repo
repo_path=/data
cat <<'EOF'
[local]
name=local
baseurl=file://$repo_path
enabled=1
gpgcheck=0
EOF
2.2.加反斜杠
3.实现多行注释
加 :
注意:换#号效果会更好
4.去除tab键影响
开头标记前要加 -
三.Except实现免交互
1.Except概述
- 建立在tcl之上的一个工具
- 用于进行自动化控制和测试
- 解决shell脚本中交互相关的问题
2.Except安装
[root@localhost day20]# yum install -y expect
3.编写expect免交互脚本步骤
3.1.先声明解释器
#!/usr/bin/expect
3.2.接收位置参数传入
set 变量名 [lindex $argv 0]
0代表执行脚本时后面跟的第一个位置参数,第二个位置参数用 1 表示,依此类推
3.3.使用 spawn 指定交互命令 开启会话跟踪
spawn fdisk /dev/sdb
3.4.使用 expect 捕获匹配交互命名的提示信息
expect "命令(输入 m 获取帮助):"
补充except
- 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
- 只能捕捉由spawn启动的进程的输出
- 用于接收命令执行后的输出,然后和期望的字符串匹配
3.5.再使用 send 发送需要交互输入的字符串,结尾需要加上回车符
send "n\r"
....
补充send
- 向进程发送字符串,用于模拟用户的输入
- 该命令不能自动回车换行,一般要加\(回车)
四.Expect免交互脚本
示例1:ssh远程登录
#!/usr/bin/expect
set dest_host [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $dest_host
expect {
"Connection refused" {send_user "目标主机访问被拒绝\n"}
"No route to host" {send_user "目标主机没有开机\n"}
"(yes/no)" {send "yes\r"; exp_continue;}
"*password:" {send "$password\r"}
}
interact
虚拟机上关闭
虚拟机上开启
成功
示例2:免交互预设值修改密码
#!/usr/bin/expect
set username [lindex $argv 0]
set password [lindex $argv 1]
spawn passwd $username
expect "新的 密码: " {send "${password}\r"}
expect "重新输入*" {send "${password}\r"}
expect eof
[root@localhost day20]# chmod +x demo3.sh
[root@localhost day20]# ./demo3.sh zhangsan 123456
示例3:su命令切换用户
#!/usr/bin/expect
set timeout 1
set username [ lindex $argv 0 ]
set password [ lindex $argv 1 ]
spawn su $username
expect "密码"
send "$password\n"
expect "*]#"
send_user "$username 切换成功!"
interact
示例4:fdisk分区操作
#!/usr/bin/expect
set timeout 5
set name [lindex $argv 0]
spawn fdisk $name
expect "获取帮助"
send "n\r"
expect "Select"
send "p\r"
expect "分区号"
send "\r"
expect "起始"
send "\r"
expect "Last"
send "+10G\r"
expect "命令"
send "w\r"
interact