免交互:不需要人为控制就可以完成的自动化操作。
自动化运维
shell脚本和免交互是一个概念,但是有两种写法。
bash(shell的默认解释器)
Here Document 免交互
使用I/O重定向的方式将命令的列表提供给交互式的程序或者命令。
cat read
是一种标准输入。只能接受正确的指令或者命令。
格式:
命令 <<标记
内容
标记
标记要一一对应(可以自定义,一般用EOF)
例:wc -l <<ky30
123 456 789
ky30
read i <<EOF
123
EOF
使用免交互的方式传参
注意事项:
1、标记可以使用任意合法字符 test tes&*%不行 通常用EOF作为标记
2、结尾的标记一定要顶格写,前面不能有任何字符(空格都不能有)。
3、结尾的标记后面也不能有任何字符,包括空格。
4、如果开头的标记前有空格,这个空格会被自动省略。
例:使用免交互的方式定义一个变量的值(输入密码)
例2:cat 结合免交互实现重定向输出到指定文件
cat <<EOF>>test.txt
123456
EOF
变量替换:
1、在免交互当中直接引用变量
vim test.sh
#!/bin/bash
file="test.sh"
i="school"
cat > $file <<EOF
I am going to $i
EOF
执行:
2、整体赋值变量进行传参
var="great,i am going to school!"
myvar=$(cat <<EOF
today is Monday
$var
EOF
)
echo $myvar
执行:
关闭,让它这个参传不进去
把EOF用''引起来
myvar=$(cat <<'EOF'
执行:
去掉每行之前的tab字符(只能抑制tab键打出来的空格,对按出来的空格无效)
执行:
使用eof来进行多行注释:(也就是什么内容都没有,一般都在文本中直接用#注释)
:<<EOF
a
b
c
EOF
执行
以上两种了解即可
只需要掌握EOF的命令格式即可
命令 <<标记
内容
结束标记
Expect免交互(重难点,面试会问,工作当中也用得到)
tcl语言基础之上的一种工具,自动化测试和控制,主要的目的是在脚本中解决交互的问题。
需要安装
yum -y install expect
转义符(用的比较多):
\n 换行
\t 制表符,Tab键
\r 回车
\b 退格,删除键
基本命令格式:
要使用它,必须在开头声明使用expect作为解释器,bash不行
#!/usr/bin/expect
执行方式:
1、必须要赋权执行(chomd 777)
2、bash sh 都不能用 只能用./来执行
语法:
spawn 后面通常跟一个linux的执行命令。表示开启一个会话,启动一个进程,并且会跟踪后续的交互信息。
spawn passwd lisi
expect:捕获,捕获上一次执行的命令中,是否包含指定的字符串,如果有则立即返回,否则等待超时时间,自动退出。默认超时时间10s
expect 只能捕获由spawn启动的进程输出
send 向进程发送字符串,用于模拟用户的输入。该命令不能自动回车,一般后面要加一个回车键,\r或者\n
第一种写法:
expect"密码"{send"abc123\r"}
第二种写法:
expect "密码"
send "abc123\r"
第三种:多分支结构
expect
{
"密码1"{send"abc123\r"}
"密码2"{send"abc123\r"}
"密码3"{send"abc123\r"}
}
特点:只要匹配其中一个情况,执行相应的send语句,然后退出expect语句。
结束符:
expect eof
会切换回之前的终端
interacr
留在当前终端不变
set 设置超时等待时间 默认是10秒,也可以不限制超时时间,-1
set timeout 5
例1:使用免交互实现修改密码
vim passwd.sh
#!/usr/bin/expect
set timeout 5
spawn passwd lisi
expect "新的密码"
send "abc123\r"
expect "重新输入新的密码"
send "abc123\r"
expect eof
运行:先给他执行权限
再./passwd.sh
例2:切换用户
vim su.sh
#!/usr/bin/expect
set timeout 5
spawn su - root
expect "密码"
send "123\r"
interact
实现:
exp_continue
可以在expect判断之后,继续匹配expect捕获的其他内容,类似于脚本中的continue,表示允许继续向下执行指令。
exp_concontinue结束语句不能直接expect eof,否则会报错
格式:
expect{
"(yes/no)"(send "yes\r";exp_continue)
"password"(send"123\r")
}
send_user 回显信息,相当于echo
send_user ok =echo ok
接收参数:类似于shell当中的位置变量$1 $2
格式:set hostname [lindex $argv0] $1
set password [lindex $argv1] $2
用传参的方式来写 从普通用户到root用户,打印出回显信息,用传参的方式
vim su.sh
#!/usr/bin/expect
set timeout 5
set usr [lindex $argv 0]
set passwd [lindex $argv 1]
spawn su - $user
expect "密码"
send "passwd\r"
expect "*]$"
send_user "普通用户"
expect "*]#"
send_user"管理员"
interact
执行:
它没有判断条件,不支持单独打印普通用户和管理员,但是可以实现用户切换。
嵌入执行模式(在shell中嵌入交互)
以创建用户和密码为例
vim useradd.sh
#!/bin/bash
user=$1
passwd=$2
useradd $user
/user/bin/expect <<-EOF
#expect 开始标识(嵌入执行模式)
spawn passwd $user
expect "新的*"
send "${passwd}\r"
expect "${passwd}\r"
expect eof
EOF
执行:
注:嵌入执行模式有一个问题:如果涉及到终端切换,最好不要用嵌入模式
ssh远程登陆(面试题,工作中常用)
工作中会用一个免交互的脚本,来实现自动登录
vim ssh.sh
#!/usr/bin/expect
set ip 192.168.233.30
#指定远程登录的ip地址
set user root
#指定为root用户
set password 123
#设置密码为123
set timeout 5
spawn ssh $user@$ip
#root@192.168.233.30
expect {
"yes/no" {send "yes\r";exp_continue}
"passwd" {send "$passwd\r"}
}
执行:
用传参的方式来写:
#!/usr/bin/expect
set ip [lindex $argv 0]
set name [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地址有误\r"}
"yes/no" {send "yes\r";exp_continue}
"password" {send "$password\r"}
}
expect eof