免交互:不需要人为控制就可以完成的自动化操作
自动化运维Shell脚本和免交互是一个概念,但是两种写法
here document 使用i/o重定向的方式将命令的列表提供给交互式的程序或者命令
是一种标准输入,只能接受正确的指令或命令(错误的不行)
格式: 命令 <<标记......标记 注意事项:1.标记可以使用合法的字符(通常使用EOF,也可以自定义)
2.结尾的标记一定要顶格写,并于开头的标记一致;后标记的前后不能有任何字符
3.如果开头的标记前有空格,这个空格会被自动省略
结合免交互实现重定向输出到指定文件 cat <<EOF>> test.txt> 1> 2 > 3> 4> 5> EOF[root@test1 opt]# lstest.txt work7.15[root@test1 opt]# cat test.txt 12345 免交互创建文件并写入内容 [root@test1 opt]# vim test.sh #!/bin/bashfile="test.txt"i="school"cat > $file <<EOFI am goning to $iEOF[root@test1 opt]# sh test.sh [root@test1 opt]# lstest.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'ky30bogeEOF[root@test opt]# sh test.txt ky30boge 多行注释 ***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] $1set 变量名 [lindex $argv 1] $2嵌入模式:涉及到终端切换时,最好不要用嵌入模式写
#!/bin/bashuser=$1passwd=$2useradd $user/usr/bin/expect <<-EOFspawn passwd $userexpect ""send "${passwd}\r"expect ""send "${passwd}\r"interactEOF ssh远程登录通过免交互脚本实现自动远程登录
#!/usr/bin/expectset ip 192.168.220.30 #指定远程登录的IP地址set user root #指定登录root用户set password 123 #设定密码为123set timeout 5 #设定超时时间spawn ssh $user@$ipexpect {"yes/no" {send "yes\r";exp_continue}"password" {send "$password\r"}}expect eof传参自动登录
#!/usr/bin/expectset name [lindex $argv 0]set ip [lindex $argv 1]set password [lindex $argv 2]set timeout 5spawn ssh $name@$ipexpect {"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 实验:用免交互的方式给硬盘分区,格式化,和挂载