目录
一.Here Document
1.定义
2.变量
(1)变量替换成实际值
(2)整行内容作为变量并输出结果
(3)多行注释
(4)自动划分磁盘免交互
二.Expect
1.定义
2.安装
3.免交互操作
(1)脚本编辑器
(2)spawn
(3)expect
(4)send
(5)exp_continue
(6)expect eof
(7)interact
(8)set
(9)send_users
(10)接收参数
4.免交互su切换用户
一.Here Document
格式:
命令 <<标记
.......
内容 #标记之间是传入内容
.......
标记
1.定义
-
使用I/O重定向的方式将命令列表提供给交互式程序
-
标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用
2.变量
Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如 果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入 的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。
(1)变量替换成实际值
#!/bin/bash
file="EOF1.txt"
var="KY35"
cat > $file <<EOF
Hi,my name is $var
EOF
(2)整行内容作为变量并输出结果
#!/bin/bash
file="2.txt"
var="school"
my=$(cat <<EOF >$file
I am going $var
EOF
)
echo $my
(3)多行注释
#!/bin/bash
file="3.txt"
var="KY35"
myvar=$(cat <<EOF >$file
My name is $var.
How old are you?
Do you want play with me?
EOF
)
echo $myvar
###下面部分就被注释了不会显示
:<<EOF
echo "My name is $var."
echo "Do you want play with me?"
EOF
(4)自动划分磁盘免交互
fdisk /dev/sdb <<EOF
> n
> p
>
>
>
>
> w
> EOF
二.Expect
1.定义
是建立在tcl(tool command language)语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题
2.安装
yum install expect -y
3.免交互操作
(1)脚本编辑器
#!/usr/bin/expect
(2)spawn
启动新的进程并监控和捕捉
(3)expect
从进程接受字符串
(4)send
用于向进程发送字符串
方法一:
expect "密码"{send "123123\r"} #同一行send部分要有{ }
方法二:
expect"密码 #换行send部分不需要有{ )
send "abc123\r"
方法三:
expect #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{
"密码1" {send "123123\r"}
"密码2" {send "abcdef\r"}
"密码3" {send "abc123\r"}
}
(5)exp_continue
继续进行进程捕获
(6)expect eof
结束符,表示交互结束,等待执行结束,退回到原用户,与spawn对应。
(7)interact
允许用户交互
-
会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命.令不起作用;
-
比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
-
使用interact会保持在终端而不会退回到原终端;
注意∶ expect eof 与 interact 只能二选一
(8)set
设置会话超时时间
(9)send_users
回显命令,类似于echo
(10)接收参数
expect 脚本可以接受从bash命令行传递参数,使用 [ lindex $argv n ] 获得。其中你从0开始,分别表示第一个,第二个,第三个.....参数
set hostname [lindex $argv 0] #相当于 hostname=s§1
set password [lindex Sargv 1] #相当于 password=$2
4.免交互su切换用户
#!/usr/bin/expect
#开启ssh命令,ssh后面跟要远程控制的IP地址
spawn ssh 192.168.79.220
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "123123\n"}
}
interact