shell编程之免交互

  • 一.免交互
    • ① Here Document 免交互
    • ② 语法格式
    • ③ 注意事项
    • ④ 支持变量替换
  • 二.Expect
    • ① 基本命令
    • ② expect直接执行,需要使用expect 命令去执行脚本
    • ③ 嵌入执行模式,将expect过程融入Shell 当中,方便执行和处理
    • ④ 实现ssh自动登录
    • ⑤ 创建磁盘分区并格式化

一.免交互

① Here Document 免交互

• 使用I/0重定向的方式将命令列表提供给交互式程序或命令,比如ftp、cat或read命令

• 是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个“文件"并用作“命令”的标准输入

• Here Document 也可以与非交互式程序和命令一起使用

② 语法格式

命令  <<标记
...
内容
...
#标记之间是传入内容
标记

③ 注意事项

• 标记可以使用任意合法字符(通常为EOF)

• 结尾的标记一定要顶格写, 前而不能有任何字符

• 结尾的标记后面也不能有任何字符( 包括空格)

• 开头标记前后的空格会被省略掉

免交互方式实现对行数的统计,将要统计的内容置于标记“EOF"之间,直接将内容传给 wc -l 来统计

wc -l  <<EOF
>Line1
>Line2
> EOF

通过read命令接收输入并打印,输入值是两个EOF 标记之间的部分,作为变量i的值

read i <<EOF
>Hi
>EOF
echo $i

通过passwd给用户设置密码

passwd lisi <<EOF
>abc1234
>abc1234#这两行是输入的密码和确认密码
>EOF

④ 支持变量替换

在写入文件时会先将变量替换成实际值,再结合cat 命令完成写入

#!/bin/bashfile="EOF1.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOFcat EOF1.txt


整体赋值给变量,然后通过echo命令将变量值打印出来

#! /bin/bash
var="Great! I am going to school!"
myvar=$(cat <<EOF
This is Line 1.
Today is Monday.
$var
EOF
)echo "$myvar"


关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换

#!/bin/bashvar="Great! I am going to school!"
myvar=$(cat <<'EOF'    #对标记加单引号,即可关闭变量替换
This is Line 1.
Today is Monday .
$var
EOF
)echo $myvar



去掉每行之前的TAB字符

#!/bin/bashvar="Great! I am going to school!"
myvar-s (cat <<-'EOF'   #在标记前加“-”,即可抑制各行首TABThis is Line 1.Today is Monday.$var
EOF
)echo $myvar


多行注释

• Bash的默认注释是“#”,该注释方法只支持单行注释: Here Document 的引入解决了多行注释的问题

• “:"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果

#!/bin/bash
var="Great! I am going to school!"
: <<-EOF   #多行注释,“:”开头的Here Document标记内容不会被执行This is Line 1.Today is Monday.$var
EOFecho "abcd"

二.Expect

建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题

rpm -q expect
rpm -q tcl
yum install -y expect

① 基本命令

1.脚本解释器

expect 脚本中首先引入文件,表明使用的是哪一个shell

#!/usr/bin/expect

2.spawn

spawn后面通常跟一-个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息

例: spawn passwd root

3.expect

• 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;

• 只能捕捉由spawn启动的进程的输出;

• 用于接收命令执行后的输出,然后和期望的字符串匹配

4.send

向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r (回车)或者\n

例:
方式一:
expect "密码" {send "abc123\r"}
#同一行send部分要有{}方式二:
expect "密码"
send "abc123\r"
#换行send部分不需要有{}方式三:
expect支持多个分支expect { #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
"密码1" {send "abc123\r"}
"密码2" {send "123456\r"}
"密码3" {send "123123\r"}
}

5.结束符

expect eof

• 表示交互结束,等待执行结束,退回到原用户,与spawn对应

• 比如切换到root用户,expect脚本默认的是等待10s当执行完命令后,默认停留10s后,自动切回了原用户

interact

• 执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命.令不起作用;比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。• 使用interact会保持在终端而不会退回到原终端;比如切换到root用户,会一直在root用户状态下:比如ssh到另一服务器,会一直在目标
服务器终端,而不会切回的原服务器

注意: expect eof 与 interact 只能二选一

6.set

expect默认的超时时间是10秒,通过set命令可以设置会话超时时间,若不限制超时时间则应设置为-1

例: set timeout 30

7.exp_ continue

exp_ continue 附加于某个expect 判断项之后,可以使该项被匹配后,还能继续匹配该expect判断语句内的其他项
exp_ continue 类似于控制语句中的continue 语句。表示允许expect 继续向下执行指令

例如:下例将判断交互输出中是否存在yes/no 或*password。 如果匹配yes/no 则输出yes并再次执行判断:如果匹配*password
则输出abc123 并结束该段expect语句expect{"(yes/no)”{send "yes\r"; exp_continue; }"*password" {set timeout 300; send "abc123\r"; }}

注意:使用exp_ continue时,如果跟踪像passwd 这样的输入密码后就结束进程的命令,expect{}外不要再加expect eof
因为spawn进程结束后会默认向expect发送eof,会导致后面的expect eof 执行报错

8.send_ user

send_ user 表示回显命令,相当于echo

9.接收參数

expect脚本可以接受从bash命令行传递的参数,使用[lindex sargv n]获得。其中n从0开始,分别表示第一个 ,第二个,第三个…参数

例:
set hostname [lindex $argv 0]   相当于hostname=$1
set password [lindex Sargv 1]   相当于password=$2

② expect直接执行,需要使用expect 命令去执行脚本

su切换用户

#!/usr/bin/expect#设置超时时间
set timeout 5#参数传入
set username [lindex $argv 0]
set password [lindex $argv 1]#开始追踪命令
spawn su $username#免交互执行,捕捉信息并匹配
expect "密码"
send "$password\r"
expect "*]#"
send_user "ok"#把控制权交给控制台
interact
#expect eof



③ 嵌入执行模式,将expect过程融入Shell 当中,方便执行和处理

创建用户并设置密码

#!/bin/bash
user=$1
password=$2#非交互命令放在expect外面
useradd $user#开始免交换执行
/usr/bin/expect <<-EOF
#expect开始标志
spawn passwd $user
#开启一个进程跟踪passwd命令,expect 只能捕捉该进程信息expect "新的*"
send "${password}\r"
expect "重新*"
send "${password}\r"
expect eof
EOF

④ 实现ssh自动登录

#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]spawn ssh Shos tname
expect {"Connection refused" exit#连接失败情况,比如对方ssh服务关闭"No route to host" exit#找不到服务器,比如输入的IP地址不正确"(yes/no)”{send "yes\r";exp_continue }"password:" { send "$password\r"}
} interact
exit    #interact后的命令不起作用

⑤ 创建磁盘分区并格式化

可使用echo再标准输入
方法一:
#!/bin/bash
NEWDEV='ls /dev/sd* Igrep -0 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
done
mkfs.xfs /dev/${VAR}"1" &> /dev/null方法二:
echo -e "n\np\n\n\n\nw\n" > fd.txt
fdisk /dev/$VAR < fd. txt方法三:
echo "nPw"| fdisk /dev/$VAR

Here Document:


Expect:

Expect 自动化控制和测试 Here Document 免交互 Linux- shell编程之免交互相关推荐

  1. 【拔刀吧少年】之Expect 自动化控制和测试 Here Document 免交互

    免交互 一.Here Document免交互 1.1 概述 1.2 语法格式 1.3 简单案例 1.4 支持变量替换 1.5 多行注释 1.6 完成自动划分磁盘免交互 二.Expect进行免交互 2. ...

  2. Shell编程之免交互(Here Document、Expect(直接与嵌入执行))

    Shell编程之免交互(Here Document.Expect)(直接与嵌入执行) 一:Here Document 1.1:Here Document概述 1.2:Here Document使用注意 ...

  3. Shell编程之免交互

    目录 一. Here Document免交互 1. 免交互定义 2. 语法格式 3. 应用示例 3.1 示例1 3.2 示例2 3.2 示例3 4. Here Document 变量设定 4.1 示例 ...

  4. Expect自动化控制简单介绍

    telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等.该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制:也可利用Tk工具,将交互程序包装在X11的 ...

  5. linux 免sudo,linux 创建用户,免密sudo,ssh免密登录

    useradd dsuser 创建用户dsuser passwd dsuser 给已创建的用户dsuser 设置密码 免密sudo 配置步骤如下: 1.登陆或切换到root用户下: 2.添加sudo文 ...

  6. UI自动化工具Cypress测试案例、生成报告---Linux版

    一.提前环境准备 node.js 必须 二.拉取gitLad上的测试案例代码 例如:拉取下来的文件夹是 -/xbox_test/cypress–0.4 如图:目录示范 三.进入拉取代码的根目录 例如: ...

  7. Linux shell编程(四)流程控制

    在Bash Shell中,流程控制命令有两个类:"选择"和"循环".属于"选择"的有:if,case;属于"循环"的有: ...

  8. linux设置程序循环,linux shell编程学习笔记(7)流程控制之循环结构

    2.1.for循环 1)遍历/列表式循环 --根据变量的不同取值,重复执行命令序列 格式: for  变量名  in 值列表 do 命令序列 done 示例:输出在线的主机IP #!/bin/bash ...

  9. Linux Shell编程及自动化运维实现 变量

    SHELL 前言 什么是shell shell壳命令解释器,一种应用程序. shell语言的特点SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称.Shell本身是一个用 ...

最新文章

  1. linux下QT Creator常见错误及解决办法
  2. gaokao--抓取高校基本信息
  3. mysql中备份和导出的区别_mysql的备份和导出
  4. 读书计划清单之碎碎念
  5. 删除文件夹中包含的子文件夹及文件
  6. 阿里开源Euler:国内首个工业级图表征学习框架
  7. java证书 查看cacer_R 语言关于 SSL 证书异常处理笔记
  8. python2.7 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5
  9. fiddler安装安全证书
  10. Semaphore释疑
  11. 产品经理的工作及职责
  12. Vokenization:一种比GPT-3更有常识的视觉语言模型
  13. 玩转华为ENSP模拟器系列 | 接入用户采用Windows7客户端通过IKEv2方式接入总部VdPdNd(采用证书认证方式)
  14. linux系统能做什么的,Linux系统适合日常使用吗?普通人学Linux能干什么
  15. 5G NGC — NRF 网络注册功能
  16. [Python]networkx入门
  17. 均匀分布的期望与方差计算公式
  18. Flink/Hbase 异常 - 4.Sink 背压100% 与 hbase.util.RetryCounter.sleepUntilNextRetry 异常分析与排查
  19. android动态分区AB升级,Android A/B 系统升级简介
  20. 解决ios在微信内置浏览器中video播放的全屏问题

热门文章

  1. 【ROS Gazebo专题】四、将Fetch机器人放到Gazebo中进行玩耍
  2. ZT 头文件包含其实是一想很烦琐的工作 第一个原则应该是,如果可以不包含头文件...
  3. vue mysql 电商,Vue电商项目
  4. 步入社会的第一个迷茫期
  5. 宜人贷蜂巢ELK Stack之elasticsearch权限探索
  6. 第三方电视刷鸿蒙,小米电视怎么刷鸿蒙OS系统?一招立省上千块
  7. STM32开发实例 基于STM32单片机的智能机房系统
  8. 测试Friendly Flickr
  9. 带你了解网络解说--链路聚合技术
  10. go postgresql 增删改查