目录:

一、Here Document 免交互

二、Expect

一、Here Document 免交互

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

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

语法格式∶

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

注意事项∶

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

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

1  wc -l <<EOF
2 > abc
3 > 123
4 > def
5 > EOF
6 3

通过 passwd 给用户设置密码

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

1、支持变量替换

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

1 #!/bin/bash
2
3 file="EOF1.txt"
4 i="school"
5 cat > $file <<EOF
6 I am going to $i
7 EOF
8
9 cat EOF1.txt

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

 1 #! /bin/bash
2 var="Great! I am going to school!"
3 myvar=$(cat <<EOF
4 This is Line 1.
5 Today is Monday.
6 $var
7 EOF
8 )
9
10 echo "$myvar"

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

 1 #!/bin/bash
2
3 var="Great! I am going to school!"
4 myvar=$(cat <<'EOF' #对标记加单引号,即可关闭变量替换
5 This is Line 1.
6 Today is Monday .
7 $var
8 EOF
9 )
10
11 echo $myvar

4、去掉每行之前的TAB字符

 1 #!/bin/bash
2
3 var="Great! I am going to school!"
4 myvar-s (cat <<-'EOF' #在标记前加“-”,即可抑制各行首TAB
5 This is Line 1.
6 Today is Monday.
7 $var
8 EOF
9 )
10
11 echo $myvar

5、多行注释

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

二、Expect

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

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

1、基本命令∶

(1)脚本解释器

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

#!/usr/bin/expect

(2)spawn

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

例∶ spawn passwd root

(3)expect

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

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

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

(4)send

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

 1 例:
2 方式一:
3 expect "密码" {send "abc123\r"}
4 #同一行send部分要有{}
5
6 方式二:
7 expect "密码"
8 send "abc123\r"
9 #换行send部分不需要有{}
10
11 方式三:
12 expect支持多个分支
13
14 expect { #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
15 "密码1" {send "abc123\r"}
16 "密码2" {send "123456\r"}
17 "密码3" {send "123123\r"}
18 }

(5)结束符

1,expect eof

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

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

2,interact

执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作 了,interac t后的命令不起作用,比如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 继续向下执行指令

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

注意:使用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

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

su切换用户

 1 #!/usr/bin/expect
2
3 #设置超时时间
4 set timeout 5
5
6 #参数传入
7 set username [lindex $argv 0]
8 set password [lindex $argv 1]
9
10 #开始追踪命令
11 spawn su $username
12
13 #免交互执行,捕捉信息并匹配
14 expect "密码"
15 send "$password\r"
16 expect "*]#"
17 send_user "ok"
18
19 #把控制权交给控制台
20 interact
21 #expect eof

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

创建用户并设置密码

 1 #!/bin/bash
2 user=$1
3 password=$2
4
5 #非交互命令放在expect外面
6 useradd $user
7
8 #开始免交换执行
9 /usr/bin/expect <<-EOF
10 #expect开始标志
11 spawn passwd $user
12 #开启一个进程跟踪passwd命令,expect 只能捕捉该进程信息
13
14 expect "新的*"
15 send "${password}\r"
16 expect "重新*"
17 send "${password}\r"
18 expect eof
19 EOF

3、实现ssh自动登录

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

4、创建磁盘分区

 1 #!/bin/bash
2
3 /usr/bin/expect <<EOF
4 spawn fdisk /dev/sdb
5
6 expect "(输入 m 获取帮助):"
7 send "n\n"
8 expect " (default p):"
9 send "p\r"
10 expect "(1-4,默认 1):"
11 send "\r"
12 expect "起始 扇区"
13 send "\r"
14 expect "Last 扇区"
15 send "+6G\r"
16 expect "命令"
17 send "w\r"
18
19 expect eof
20 EOF
21
22 echo "Creating a successful"

  

  

shell编程之免交互的更多相关文章

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

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

  2. 8.shell编程之免交互

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

  3. shell编程-ssh免交互批量分发公钥脚本

    脚本基本原理 1.控制端免交互创建秘钥和公钥: 1 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" 2.免交互发送公钥 1 sshpass ...

  4. shell中expect免交互

    expect前言观察ssh登录的交互现象有些程序难以避免的需要交互.你该如何解决脚本与程序的交互问题?名词解释期待, 预期, 盼望, 预料,料想, 指望, 希望, 要求,想, 认为一.概述 我们通过S ...

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

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

  6. Shell 信号处理 & Expect 免交互

    监控脚本项目 信号处理 1 什么是信号 由键盘组合键或者 kill 命令发出操作称之为信号 信号是发送给进程的,进程在收到信号后会作出默认的响应 2 为何要在进程内处理信号 进程在收到信号后会有默认的 ...

  7. expect实现免交互

    如果想写一个能够自动处理输入输出的脚本又不想面对C或Perl,那么expect是最好的选择.它可以用来做一些Linux下无法做到交互的一些命令操作. (1).安装和使用expect expect是不会 ...

  8. Shell 编程 免交互 expect

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

  9. Shell编程 | 脚本参数与交互及常见问题

    在执行一个脚本程序时,会经常需要向脚本传递一些参数,并根据输入的参数值生成相应的数据或执行特定的逻辑. 向脚本传递参数 执行Shell脚本时可以带有参数,在Shell脚本中有变量与之对应进行引用.这类 ...

随机推荐

  1. 离线webpack创建vue 项目

    参考地址: https://blog.csdn.net/feinifi/article/details/104578546 画重点: // 需要带上参数--offline表示离线初始化. --offl ...

  2. centos linux下配置固定ip,方便xshell连接

    如何给centos linux设置固定ip地址,设置Linux系统的固定IP地址 首先wmware打开虚拟机 打开xshell6连接虚拟机(比较方便,这里默认设置过Linux的ip,只是不固定,每次打 ...

  3. JavaScript关于返回数据类型一个小小的笔记

    Javascript关于返回数据类型的一个小笔记 javascript数据类型有两种. 一种是基本数据类型:String.Number.Boolean.Symbol.Underfine.Null 一种 ...

  4. Windows协议 LDAP篇 - 域权限

    windows 访问控制模型 也就是大名鼎鼎的ACM,access control mode 由两部分组成的. 访问令牌(access tokens) 其中包含有关登录用户的信息(User SID,G ...

  5. 【原创】在macOS Big Sur (Silicon M1, ARM)中配置ASP运行环境

    亲测有效,转载请附原文地址. 一,安装Parallels Desktop,注意选择支持ARM的版本. 二,注册 Windows Insider Preview Downloads 账号,通过以下链接下 ...

  6. 线程优先级_priority

    线程优先级_priority Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行 线程的优先级用数字表示,范围从1~10 Thread. ...

  7. Python -类型提示 Type Hints

    为什么会有类型提示 Python是一种动态类型语言,这意味着我们在编写代码的时候更为自由,运行时不需要指定变量类型 但是与此同时 IDE 无法像静态类型语言那样分析代码,及时给我们相应的提示,比如字符 ...

  8. Using Emacs as Clojure IDE

    Open emacs24; Change CWD to parent folder of project home: M-x cd ~/docs/tmp; Build a leiningen proj ...

  9. MySQL-02-体系结构

    MySQL体系结构 c/s模型介绍 连接MySQL # TCP/IP方式(远程.本地) mysql -uroot -pAlnk123 -h 10.0.0.51 -P3306 # Socket方式(仅本 ...

  10. Linux sudo权限提升漏洞CVE-2021-3156 POC及复现过程

    漏洞简介 2021年1月26日,国外研究团队披露了sudo 中存在的堆溢出漏洞(CVE-2021-3156).利用该漏洞,非特权账户可以使用默认的sudo配置主机上获取root权限,该漏洞影响1.8. ...