Shell Here Document 免交互命令和Expect

  • 一、Here Document 免交互命令
  • 二、Expect
    • 1.基本命令
    • 2.示例
    • 3.嵌入执行模式
    • 4.实现ssh自动登录
    • 5.免交互创建磁盘

一、Here Document 免交互命令

使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp、cat或read命令。
是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生成出一个“文件”并用作“命令”的标准输入。Here Document 也可以与非交互式程序和命令一起使用。

语法格式:
命令 <<标记
...
内容    #标记直接是传入内容
...
标记

注意事项:
标记可以使用任意合法字符 (通常使用EOF)
结尾的标记一定要顶格写,前面不能有任何字符
结尾的标记后面也不能有任何字符(包括空格)
开头标记前后的空格会被省略掉

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

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

通过passwd给用户设置密码passwd zhangsan <<EOF
>35123512
>35123512
EOF

支持变量替换
在写入文件时会先将变量替换成实际值,再结合cat 命令完成写入#!/bin/bash
file="eof1.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF


整体赋值给变量,然后通过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/bash
var="Great! I am going to school!"
myvar=$(cat <<'EOF'
This is Line 1.
Today is Monday.
$var
EOF
)echo $myvar


去掉每行之前的TAB字符#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<-'EOF'        #在标记前加“-”,即可抑制各行tab字符This is Line 1.Today is Monay.$var
EOF
)
echo "$myvar"


多行注释
Bash 的默认注释是“#”,该注释方法只支持单行注释:Here Document 的引入解决了多行注释的问题。
":"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果。#!/bin/bash
var="Great! I am going to school!"
: <<-EOF      This is Line1.Today is Monday.$var
EOF
echo "abcd"


二、Expect

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

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

1.基本命令

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 "123123\r"}"
"密码3 {send "123123\r"}"
}

5.结束符
expect eof
表示交互结束,等待执行结束,退回到原用户,与spawn对应
比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户

interact
执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。

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 并再次执行判断;如果匹配 *assword则输出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 $argv n] 获得。其中n从0开始,分别表示第一一个, 第二个,第三个…参数。

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

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


3.嵌入执行模式

创建用户并设置密码

#! /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

4.实现ssh自动登录

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

嵌入式:

#!/bin/bash
hostname=$1
password=$2/usr/bin/expect <<EOF
spawn ssh root@${hostname}expect {"Connection refused" exit"No route to host" exit"(yes/no)" {send "yes\r";exp_continue}"password" {send "$password\r"}
}
expect "*]#"
send "ifconfig\r"
expect eof
EOF

5.免交互创建磁盘

#!/bin/bash
disk=$1
/usr/bin/expect <<EOF
spawn fdisk $disk
expect "命令" {send "n\r"}
expect "Select" {send "p\r"}
expect "分区" {send "\r"}
expect "起始" {send "\r"}
expect "Last" {send "\r"}
expect "命令" {send "w\r"}
expect  eof
EOF


Shell Here Document 免交互命令和Expect相关推荐

  1. shell脚本详解(十二)——Here Document免交互及Expect自动化交互

    shell脚本详解(十二)--Here Document免交互及Expect自动化交互 一.Here Document 免交互 1.格式 2.注意事项 3.免交互方式实现对行数的统计,将要统计的内容置 ...

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

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

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

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

  4. Here Document免交互和Expect自动化交互

    目录 一.免交互 1.Here Document 免交互定义 2.语法格式 3.注意事项 (1)免交互方式实现对行数的统计,将要统计的内容置于标记"EOF"之间,直接将内容传给 w ...

  5. Expect 自动化控制和测试 Here Document 免交互 Linux- shell编程之免交互

    shell编程之免交互 一.免交互 ① Here Document 免交互 ② 语法格式 ③ 注意事项 ④ 支持变量替换 二.Expect ① 基本命令 ② expect直接执行,需要使用expect ...

  6. Shell脚本之免交互

    Shell脚本之免交互 一.Here Document 免交互 1.1 Here Document 免交互的概念 1.2 语法格式 1.3 相关实例 二.Expect免交互 2.1 基本命令 2.2 ...

  7. Shell编程之免交互

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

  8. Here Document免交互

    文章目录 Here Document免交互 定义 Here Document常规用法 语法格式 注意事项 免交互的方式实现对行数的统计,将要统计的内容置于"EOF"之间,直接将内容 ...

  9. Shell批量SSH免交互登录认证

    脚本实现功能:批量或单个SSH免交互登录认证 脚本应用场景:当部署集群时,大多数实现要配置好管理节点与从节点的SSH免交互登录,针对这样的情况,写了下面脚本,简化工作. 脚本支持系统:Ubuntu和C ...

最新文章

  1. 介绍几款浏览器兼容性测试工具
  2. 2021牛客多校1 - Hash Function(思维+FFT)
  3. HDU - 1890 Robotic Sort(Splay-区间翻转+删除根节点)
  4. Python+pandas使用分裂与分组统计频次
  5. 技术人员如何持续不断的成长?
  6. Linux中Shell重定向
  7. 前景检测算法(十六)--背景减除结束篇
  8. java中mysql.ini_为什么找不到mysql.ini文件,我是放在scr目录下的
  9. STM32 Keil安装和配置
  10. 提高计算机CPU运行速度,提高cpu运行速度的方法
  11. TeamViewer远程访问打开软件黑屏
  12. 关于 NM_CONTROLLED和Network Manager
  13. Python练习题答案: IRR计算 - 盈利能力的评价【难度:2级】--景越Python编程实例训练营,1000道上机题等你来挑战
  14. DGV中复选框第一列可编辑 ,第一列固定显示
  15. AT-GAN: A Generative Attack Model for Adversarial Transferring on Generative Adversarial Nets
  16. Linux防火墙入门:简介(转)
  17. 让SOLIDWORKS子装配体动起来的方法
  18. 山东工商学院计算机专业在哪个校区,山东工商学院计算机
  19. 第十三章:摄像头接口介绍
  20. 私募多渠道扩张资本版图

热门文章

  1. 55万字,阿里内部最新最全Java面试进阶手册,能横扫95%的面试官
  2. 惊!空 struct 地址竟然不相等
  3. 一文简述FFmpeg
  4. 编解码再进化:Ali266与下一代视频技术
  5. LiveVideoStackCon 2020上海 6月见
  6. ​SoundCloud的web播放库Maestro演进之路
  7. B站QUIC实践之路
  8. Hadoop之Join、计数器、数据清洗概述
  9. Java基础之多态深入解析
  10. Linux 入门必看:如何60秒内分析Linux性能