shell免交互

目录

免交互

here Documernt 免交互

格式

注意事项

Expect免交互

转义符

基本命令格式

语法

spawn

expect 

send

结束符

set

exp_continue

接收参数 

嵌入执行模式

实验

例一

例二 


免交互

不需要人为控制就可以完成的自动化操作
自动化运维
shell脚本和免交互是一个概念,但是两种写法
shell 解释器是bash

here Documernt 免交互

使用i/o重定向的方式将命令的列表提供给交互式的程序或者命令
是一种标准输入,只能接受正确的命令或指令

格式

命令 <<标记
内容
标记


wc -l < 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

你可能感兴趣的:(linux的学习,交互,microsoft,服务器,linux,运维)