目录
免交互
不需要人为控制就可以完成的自动化操作
自动化运维
shell脚本和免交互是一个概念,但是两种写法
shell 解释器是bash
here Documernt 免交互
使用i/o重定向的方式将命令的列表提供给交互式的程序或者命令
是一种标准输入,只能接受正确的命令或指令
格式
命令 <<标记
内容
标记
如
wc -l <<EOF
aaa
bbb
ccc
EOF
注意事项
1.标记可以使用任意合法字符(通常使用EOF)
2.结尾的标记一定要顶格写,前面不能有任何字符
3.结尾的标记后面也不能有任何字符
4.如果开头的标记前有空格,这个空格会被自动省略
Expect免交互
是tcl语言基础之上的一种工具,用于自动化测试和控制,在脚本中解决交互问题
转义符
\n 表示换行
\t 制表符,TAB键
\r 回车
\b 退格符、删除键
基本命令格式
#!/usr/bin/expect
执行方式
1.必须赋权执行
2.只能用./来执行
语法
spawn
spawn后面通常跟一个linux的执行命令,表示开启一个会话,启动一个进程,并且跟踪后续的交互信息
expect
捕获上一次执行的命令中是否包含指定的字符串,如果有立即返回否则等待超时事间,自动退出。默认超时时间为10秒
expect只能捕获由spawn启动的进程输出
send
向进程发送字符串,用于模拟用户的输入该命令不能自动回车,一般后面要\r或者\n
第一种写法
ecpect "..."{send "...\r"}
第二种写法
expect ""
send "...\r"
第三种:多分支结构
expect
{
"..."{send "...\r"}
"..."{send "...\r"}
"..."{send "...\r"}
}
只要匹配其中一个情况,就会执行相应的send语句,然后退出expect语句
结束符
expect eof
会切换回之前的终端
interact
留在当前终端不变
set
设置超时等待时间,默认10s
set timeout 时间
不限制超时时间-1
exp_continue
可以在expect判断之后继续匹配expect捕获的其他内容,类似于脚本中的continue,表示运行继续向下执行指令
exp_continue 结束语句不直接能使用expect eof,否则会报错
expect {
"(...)"{send "...\r";exp_continue}
"(...)"{send "...\r"}
}
i
send_user 回显信息,相当于echo,后面跟上用户想要输出的内容
接收参数
类似于shell当中的位置变量
set 变量名 [lindex $argv 0]
set 变量名 [lindex $argv 1]
嵌入执行模式
/usr/bin/expect <<-EOF
如果涉及终端切换,最好不要用嵌入模式
实验
例一
ssh远程登录用免交互脚本,实现自动登陆 面试题
#!/usr/bin/expect
set name [lindex $argv 0]
set ip [lindex $argv 1]
set passwd [lindex $argv 2]
set timeout 5
spawn ssh $name@$ip
expect {
"refused" {send_user "访问被拒绝\r"}
"No route to host" {send_user "主机名或IP地址有误\n"}
"yes/no" {send "yes\r";exp_continue}
"password" {send "$passwd\r"}
}
interact
例二
磁盘分区与格式化
#!/bin/bash
name=$1
cph=$2
mulu=$3
set timeout 5
/usr/bin/expect <<-EOF
spawn fdisk /dev/$name
expect "help"
send "n\r"
expect "Select"
send "\r"
expect "number"
send "$cph\r"
expect "First"
send "\r"
expect "Last"
send "+5G\r"
expect "Command"
send "w\r"
interact
EOF
partprobe
mkfs.xfs -f /dev/$name$cph
if [ $? -eq 0 ]
then
echo "格式化成功"
mount /dev/$name$cph $mulu
if [ $? -eq 0 ]
then
echo "挂载成功"
else
echo "挂载失败"
fi
else
echo "格式化失败"
fi