一、Here Document免交互

1.1 概述

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

是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个"文件"并用作"命令"的标准输入。Here Document 也可 以与非交互式程序和命令一起使用。

1.2 语法格式

命令 <<标记

.......

内容 #标记之间是传入内容

.......

标记

注意事项∶

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

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

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

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

扩展:

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

wc -l <<EOF

123

345

567

EOF

1.3 简单案例

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



实例2:

通过 passwd 给用户设置密码。

1.4 支持变量替换

实例1:测试EOF中变量被替换为实际值。

1.5 多行注释

Bash 的默认注释是"#",该注释方法只支持单行注释;Here Document 的引入解决了多行注释的问题。

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

1.6 完成自动划分磁盘免交互

[root@localhost ~]# fdisk /dev/sdb <<EOF

n

p

w

EOF

二、Expect进行免交互

2.1 概述

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

2.2 使用Expect实现面交互功能的操作步骤

准备工作:

rpm-q expect #查看expect程序是否安装

rpm-q tcl #查看tcl程序是否安装

yum install_-y expect #未安装的话进行安装

1)指定脚本解释器

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

!/usr/bin/expect

2)spawn

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

例∶ spawn passwd root

3)expect

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

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

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

expect "匹配内容" {send “后续操作”;}

4)send

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

方式一∶

expect "密码"{send "123123\r"} #同一行send部分要有{ }

方式二∶

expect"密码 #换行send部分不需要有{ )

send "abc123\r"

方式三∶

expect支持多个分支

expect #只要匹配了其中一个情况,执行相应的 send语句后退出该expect语句

{

"密码1" {send "123123\r"}

"密码2" {send "abcdef\r"}

"密码3" {send "abc123\r"}

}

5)结束符 expect eof

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

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

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 "abcl23\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=s§1

set password [lindex Sargv 1] #相当于 password=$2

三、使用expect命令去执行脚本

su切换用户



先赋予最高权限777,把脚本移动到opt目录。



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

创建用户并设置密码



实现ssh自动登录

四、完成自动划分磁盘免交互

!/usr/bin/expect

set dev [lindex $argv 0]

spawn fdisk $dev

expect "(输入m获取帮助):"

send "n\r"

expect "(设置分区):"

send "p\r"

expect "(1-4,默认为1):"

send "\r"

expect "起始扇区"

send "\r"

expect "Last 扇区"

send "+6G\r"

expect "已设置为Linux 类型"

send "w\r"

expect eof

expect命令和here document免交互的更多相关文章

  1. linux下expect命令实现批量ssh免密

    有时候我们需要批量发送ssh命令给服务器,但是有可能有些服务器是新加入的,还没有配置ssh免密,这个时候就会提示我们输入yes/no 或者password等,expect脚本命令就是用于在提示这些的时 ...

  2. shell编程之免交互

    目录: 一.Here Document 免交互 二.Expect 一.Here Document 免交互 使用I/O重定向的方式将命令列表提供给交互式程序或命令, 比如 ftp.cat 或 read ...

  3. shell免交互

    目录 一.Here Document免交互 1.1.Here Document概述 1.2.注意事项 1.3.免交互示例 wc -l实现对行数的统计 read命令接收输入并打印 passwd给用户设置 ...

  4. shell编程之免交互 (不要再让你的双手过度劳累了)

    shell编程之免交互 1.Here Document免交互 2.Expect免交互 3.免交互磁盘创建 1.Here Document免交互 概述: Here Document使用I/O重定向的方式 ...

  5. 8.shell编程之免交互

    shell编程之免交互 目录 shell编程之免交互 Here Document免交互 免交互定义 Here Document变量设定 多行的注释 expect expect 定义 expect基本命 ...

  6. linux免交互登陆远程主机并执行命令(密钥对和Expect)

    原文章摘自:http://lizhenliang.blog.51cto.com/7876557/1607723/ Linux下实现免交互登陆一般有两种: 1. SSH无密码认证方式 客户端使用ssh- ...

  7. expect--脚本实现免交互命令

    转自:http://blog.51cto.com/lizhenliang/1607723 注意:使用expect脚本时,需要把脚本添加执行权限,然后./test.sh直接执行,不能用sh或者sourc ...

  8. Shell 编程 免交互 expect

    本篇主要写一些shell脚本免交互expect的使用. 概述 Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题. 安装 ...

  9. expect免交互用法

    一.ssh免交互远程连接linux服务器 ssh在远程连接linux系统时,会有交互,比如输入yes/no,或者需要输入密码.我们怎么避免这些交互呢!比如我们可以用telnet远程登录交换机,去备份交 ...

随机推荐

  1. 关于Mysql事务,你必须知道的几个知识点!

    Transaction事务 上期我们讲到了jpa的常用操作,查询.更新.删除等,但是如果在操作数据库事务时发生异常,数据会回滚吗?下面我们来看个例子 UserController新增如下代码: @Ge ...

  2. Netty 框架学习 —— 预置的 ChannelHandler 和编解码器

    Netty 为许多提供了许多预置的编解码器和处理器,几乎可以开箱即用,减少了在烦琐事务上话费的时间和精力 空闲的连接和超时 检测空闲连接以及超时对于释放资源来说至关重要,Netty 特地为它提供了几个 ...

  3. 陋居寡闻,初探Github CLI For Windows,开启命令行撸铁时代

    简介 gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to t ...

  4. oracle行转列实现

    1.新建测试表 create table TEST_TABLE( T1 VARCHAR2(10),--姓名 T2 VARCHAR2(10),--科目 T3 VARCHAR2(10)--成绩 ) 2.插 ...

  5. hdu 3397 Sequence operation 线段树 区间更新 区间合并

    题意: 5种操作,所有数字都为0或1 0 a b:将[a,b]置0 1 a b:将[a,b]置1 2 a b:[a,b]中的0和1互换 3 a b:查询[a,b]中的1的数量 4 a b:查询[a,b ...

  6. macos 安装telnet命令

    在10.12及以下版本,都内置了telnet命令,但是在10.13中,已经取消了 接下来给大家介绍下如何安装telnet命令 打开"终端",输入: /usr/bin/ruby -e ...

  7. mybatis 配置的log4j文件无效,不能正常显示日志信息

    正在学习mybatis,配置好后log4j.properties文件后,日志信息不能正常显示,没有效果. 查看了一下mybatis的相关文档,在日志一栏找到问题愿意 原因是我们的mybatis选了其他 ...

  8. Selenium启动Firefox示例(python版)

    目前做selenium自动化使用的主流语言分为java和python,前一篇为java版,本篇介绍python实现selenium启动Firefox. 1 #-*- coding:utf-8 -*- ...

  9. EXCEL:关键字有重复,其他信息一行多列显示

    =INDEX(A:A,SMALL(IF(MATCH($A$2:$A$13,$A$2:$A$13,0)=ROW($A$2:$A$13)-1,ROW($2:$13),4^8),ROW(1:1)))& ...

  10. VS2013产品密钥

    VS2013 产品密钥 – 所有版本  Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio ...