Shell的字符处理和expect

一、Here Document免交互

1.1Here Document概述

使用I/O重定向的方式将命令列表提供给交互式程序,标准输入的一种替代品

格式:

  1. 命令 <<标记
  2.  
  3. 输入内容
  4.  
  5. 标记

1.2Here Document使用注意事项

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

1.3Here Document操作

1.统计行数

Shell的字符处理和expect_第1张图片

2.read 命令

Shell的字符处理和expect_第2张图片

3.使用 passwd命令设置密码

EOF 标记之间的两行是输入的密码和确认密码,两行内容必须保持一致,否则密 码设置不成功。此脚本执行后不会输出任何信息,可另开一个终端使用 jerry 用户登录,输 入新修改的密码来验证密码是否修改正确

Shell的字符处理和expect_第3张图片

1.4Here Document 变量设定

Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如 果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入 的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。

1.查看内容

Shell的字符处理和expect_第4张图片

2.重定向输出到文件中

Shell的字符处理和expect_第5张图片

3.tee:实现标准输入与输出

Shell的字符处理和expect_第6张图片

4.字符串作为变量

Shell的字符处理和expect_第7张图片

5.整行内容作为变量输出结果

Shell的字符处理和expect_第8张图片

6.变量不变成实际值,且忽略tab键

Shell的字符处理和expect_第9张图片

二、Expect

1.expect简介

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

使用expect命令前需要先进行安装tcl与expect软件,在安装expect软件自动安装依赖包tcl
先检查系统内是否安装expect软件包

格式:

expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]

expect中相关命令

  • spawn 启动新的进程(监控,捕捉)

spawn  passwd root

  • expect 从进程接收字符串

  • send 用于向进程发送字符串

  • exp_continue 匹配多个字符串在执行动作后加此命令

  • interact 允许用户交互expect eof

Shell的字符处理和expect_第10张图片

1.免交互,传输文件

Shell的字符处理和expect_第11张图片

2.expect基本命令

(1)脚本解释器

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

#!/usr/ bin/expect

(2) spawn

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

(3) expect

  • 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;
  • 只能捕捉由sawn启动的进程的输出;
  • 用于接收命令执行后的输出,然后和期望的字符串匹配

(4) send

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

方式一:
expect "密码" {send "abc123\r"}     #同一行send部分要有{}

方式二:
expect "密码"  
send "abc123\r"                    # 换行send部分不需要有{}


方式三:
expect 支持多个分支
expect          #只要匹配了其中一个情况,执行相应的send 语句后退出该expect 语句
只匹配一次
expect
{
{"密码1"  {send "abc123\r"}
{"密码2"  {send "123123\r"}
{"密码3"  {send "123456\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 time out 30

(7) exp_continue

exp_continue 表示允许 expect 继续向下执行指令.

exp_continue附加于某个expect 判断选项之后,可以是该项被匹配后还能继续匹配expect 判断语句内的其他项。exp_continue类似于控制语句的continue语句。表示允许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

表示回显命令与echo相同

(9)接收参数(位置变量)

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

2.1远程拷贝

Shell的字符处理和expect_第12张图片

2.2多行重定向,改多个地址

Shell的字符处理和expect_第13张图片

Shell的字符处理和expect_第14张图片

三、字符处理

3.1字符串切片

3.1.1基于偏移量取字符

1.取字符串的长度

${#var}
#返回字符串变量var的字符的长度,一个汉字算一个字符

Shell的字符处理和expect_第15张图片

2.跳过左边的字符

${var:offset}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset:number}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分

Shell的字符处理和expect_第16张图片

3.取字符串右边的字符

${var: -length}
#取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符

Shell的字符处理和expect_第17张图片

4.掐头去尾

${var:offset:-length}
#从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾

Shell的字符处理和expect_第18张图片

5.取倒数的范围

${var: -length:-offset}
#先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length前空格,并且length必须大于offset

Shell的字符处理和expect_第19张图片

3.1.2基于模式取子串

1.删左留右

${var#*word}
#其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右

#同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}

Shell的字符处理和expect_第20张图片

2.删右留左

${var%word*}
#其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第一个word为界删右留左


${var%%word*}
#同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向左的最后一个word为界删右留左

Shell的字符处理和expect_第21张图片

3.2查找替换

${var/pattern/substr}
${变量/搜索的字符串/修改的字符串}

#查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之

${var//pattern/substr}
#查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之

${var/#pattern/substr}
#查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
#  在 此处  #代表开头


${var/%pattern/substr}
#查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
# 在此处  % 代表结尾

Shell的字符处理和expect_第22张图片

3.3查找并删除

${var/pattern}
#删除var表示的字符串中第一次被pattern匹配到的字符串

${var//pattern}
删除var表示的字符串中所有被pattern匹配到的字符串

${var/#pattern}
删除var表示的字符串中所有以pattern为行首匹配到的字符串

${var/%pattern}
删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串
 

Shell的字符处理和expect_第23张图片

3.4大小写替换

${var^^}
#把var中的所有小写字母转换为大写


${var,,}
#把var中的所有大写字母转换为小写

Shell的字符处理和expect_第24张图片

四、高级变量

4.1高级变量赋值

Shell的字符处理和expect_第25张图片

Shell的字符处理和expect_第26张图片

4.2变量的间接引用

eval命令

eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描

Shell的字符处理和expect_第27张图片

五.创建一个临时文件mktemp

mktemp 命令用于创建并显示临时文件,可避免冲突

格式:

mktemp [OPTION]... [TEMPLATE]
说明:TEMPLATE: filenameXXX,X至少要出现三个

常见选项:

-d #创建临时目录
-p DIR或--tmpdir=DIR   #指明临时文件所存放目录位置

Shell的字符处理和expect_第28张图片

5.1实现文件垃圾箱

Shell的字符处理和expect_第29张图片

5.2安装复制文件install

install 功能相当于cp,chmod,chown,chgrp ,mkdir 等相关工具的集合

install命令格式:

install [OPTION]... [-T] SOURCE DEST 单文件
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY... #创建空目录

选项:

-m MODE,       默认755
-o OWNER        拥有者
-g GROUP         属组
-d DIRNAME     目录

Shell的字符处理和expect_第30张图片

Shell的字符处理和expect_第31张图片

你可能感兴趣的:(服务器,运维,linux,交互,microsoft,centos,开发语言)