免交互:不需要人为控制就可以完成的自动化操作
自动化运维
Shell脚本和免交互是一个概念,但是两种写法
here document 使用i/o重定向的方式将命令的列表提供给交互式的程序或者命令
是一种标准输入,只能接受正确的指令或命令(错误的不行)
格式:
命令 <<标记
...
...
标记
注意事项:
1.标记可以使用合法的字符(通常使用EOF,也可以自定义)
2.结尾的标记一定要顶格写,并于开头的标记一致;后标记的前后不能有任何字符
3.如果开头的标记前有空格,这个空格会被自动省略
结合免交互实现重定向输出到指定文件
cat <<EOF>> test.txt
> 1
> 2
> 3
> 4
> 5
> EOF
[root@test1 opt]# ls
test.txt work7.15
[root@test1 opt]# cat test.txt
1
2
3
4
5
免交互创建文件并写入内容
[root@test1 opt]# vim test.sh
#!/bin/bash
file="test.txt"
i="school"
cat > $file <<EOF
I am goning to $i
EOF
[root@test1 opt]# sh test.sh
[root@test1 opt]# ls
test.sh test.txt
[root@test1 opt]# cat test.txt
I am goning to school
[root@test1 opt]#
去掉每行之前的tab字符
[root@test opt]# vim test.txt
cat <<-'EOF'
ky30
boge
EOF
[root@test opt]# sh test.txt
ky30
boge
多行注释
***Expect免交互
tcl基础语言之上的一种工具;自动化测试和控制,主要是在脚本中解决人机交互的问题
which expect 查看服务的位置
rpm -qa expect 查看服务是否安装
转义符:
\n 换行
\t 制表符,TAB
\r 回车
\b 删除键
基本命令格式:
#!/usr/bin/expect #使用时需要先在开头生命使用expect
执行方式:
1.必须赋权执行;给权限(chmod 777)
2.不能用 bash和sh 只能使用./
语法:
spawn 后面通常跟一个linux的执行命令,表示开启一个会话,启动一个进程,并且跟踪后续的交互信息
spawn passwd 用户名 #跟踪(修改用户密码)命令的执行情况
expect 捕获上一次执行的命令中,是否包含指定的字符串,如果有则立即返回,否则等待超时时间(默认10秒),超时时间自动退出
expect只能捕获有spawn启动的进程输出
send向进程发送字符串,用于模拟用户输入;该命令不能自动回车,一般后面要加一个回车键(/r或/n)
第一种写法:
expect "密码" {send "abc123\r"}
第二种写法:
expect ""
send "abc123\r"
第三种写法:多分支结构
多分支语句,只要匹配一个就会执行相应的send语句,然后就退出expect
expect
{
"密码1" {send "123\r"}
"密码2" {send "123\r"}
"密码3" {send "123\r"}
}
结束符:
expect eof 会切换回之前的终端
interact 保留当前终端不变
设置超时时间
set timeout5 获取不到,5秒后会自动退出
set timeout-1 -1表示永不超时
exp_continue
可以在expect判断之后,继续匹配expect捕获的其他内容,类似于脚本中continue,表示允许继续向下执行命令
exp_contine 结束语句不能直接使用expect eof,否则会报错
expect{
"(yes/no)" {send "yes\r";exp_continue}
"password" {send "123\r"}
}
send_user 回显信息,相当于echo,跟上用户想要输出的内容
send_user ok 打印ok
接收参数:类似于shell当中的位置变量$1 $2
set 变量名 [lindex $argv 0] $1
set 变量名 [lindex $argv 1] $2
嵌入模式:涉及到终端切换时,最好不要用嵌入模式写
#!/bin/bash
user=$1
passwd=$2
useradd $user
/usr/bin/expect <<-EOF
spawn passwd $user
expect ""
send "${passwd}\r"
expect ""
send "${passwd}\r"
interact
EOF
ssh远程登录
通过免交互脚本实现自动远程登录
#!/usr/bin/expect
set ip 192.168.220.30 #指定远程登录的IP地址
set user root #指定登录root用户
set password 123 #设定密码为123
set timeout 5 #设定超时时间
spawn ssh $user@$ip
expect {
"yes/no" {send "yes\r";exp_continue}
"password" {send "$password\r"}
}
expect eof
传参自动登录
#!/usr/bin/expect
set name [lindex $argv 0]
set ip [lindex $argv 1]
set password [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 "$password\r"}
}
expect eof
实验:
用免交互的方式给硬盘分区,格式化,和挂载