目录
免交互
不需要人为控制就可以完成的自动化操作
自动化运维
shell脚本和免交互是一个概念,但是两种写法
shell 解释器是bash
here Document 免交互
使用i/o重定向的方式将命令的列表提供给交互式的程序或者命令
cat read
是一种标准输入,只能接收正确的指令或者命令
语法格式
命令<<标记
内容
内容
标记
如
wc -l <<EOF
aaa
bbb
ccc
EOF
注意事项
1、标记可以使用任意合法字符 (通常用EOF作为标记)
2、结尾标记一定要顶格写,前面不能有任何字符
3、结尾的标记后面也不能有任何字符,包括空格。
4、如果开头的标记前有空格,这个空格会被自动省略
Expect免交互
是tcl语言基础之上的一种工具,用于自动化测试和控制,在脚本中解决交互问题
转义符
\n 表示换行
\t 制表符,TAB键
\r 回车
\b 退格符、删除键
基本命令格式
#!/usr/bin/expect
执行方式
1、必须赋权执行
chmod 777
2、bash sh 不能使用 只能用 ./
语法
spawn 后面通常跟一个linux的执行命令。表示开启一个会话,启动一个进程,并且跟踪后续的交互信息
spawn passwd lisi
expect :捕获,捕获上一次执行命令中,是否包含指定的字符串,如果有立即返回,否则等待超时时间,自动退出
expect 只能捕获有spawn 启动的进程输出
send 向进程发送字符串,用于模拟用户的输入,该命令不能自定回车,一般后面加一个回车键:\r或\n
第一种
expect "密码“{send”abc123\r"}
第二种
expect "密码"
send"abc123\r"
第三种多分支结构
expect
{
"密码1"{send"abc123\r"}
"密码1"{send"abc123\r"}
"密码1"{send"abc123\r"}
}
只要匹配其中的一种情况,执行相应的send语句,然后expect语句
结束符
expect eof
会切换回之前的终端
interact
留在当前终端不变
set
设置超时等待时间,默认10秒
set timeout 5
5秒自动退出
exp_continue
可以在expect判断之后,继续匹配expect捕获的其他内容,类似于脚本continue,表示允许继续向下执行指令。
exp_continue 结束语句不能直接使用 expect eof,否则会报错
expect {
"(yes/no)"{send"yes\r",exp_continue}
"passwd"{send"123\r"}
}
send_user 回显信息,相当于echo 跟上用户想要输出的内容
send_user ok
接收参数:类似于shell当中的位置变量$1 $2
set 变量名 [lindex $argv 0] $1
set 变量名 [lindex $argv 1] $2
嵌入执行模式
/usr/bin/expect <<-EOF
嵌入执行模式:如果涉及终端切换,不要用嵌入模式
面试题
ssh 远程登录
工作中会有一个免交互的脚本,实现自动登录
#!/usr/bin/expect
set ip 192.168.70.22 指定远程登录的IP地址
set user root 指定root用户
set passwd 123 设定密码
set timeout 5
spawn ssh $user@$ip
#192.168.70.22
expect{
"yes/no"{send yes\r;exp_continue}
"passwd"{send "$password}
远程连接免交互
#!/usr/bin/expect
set timeout 5
set ip [lindex $argv 0]
set name [lindex $argv 1]
set passwod [lindex $argv 2]
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 "$passwod\r"}
}
interact