使用I/O重定向的方式将命令列表提供给交互式程序,标准输入的一种替代品
格式:
- 命令 <<标记
- 输入内容
- 标记
EOF 标记之间的两行是输入的密码和确认密码,两行内容必须保持一致,否则密 码设置不成功。此脚本执行后不会输出任何信息,可另开一个终端使用 jerry 用户登录,输 入新修改的密码来验证密码是否修改正确
Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如 果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入 的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。
建立在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
expect脚本中首先引入文件,表明使用的是哪一个 shell。
#!/usr/ bin/expect
spawn后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息。
向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加\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"}}
expect eof
表示交互结束,等待执行结束,退回到原用户,与spawn对应
比如切换到root用户,expect 脚本默认的等待时间是10s,当执行王命令后,默认停留10s后,自动切回原用户.
interact
执行完成后保持交互状态, 把控制权交给控制台,会停留在目标终端而不是退回到原终端,这时候就可以手工操作了,interact后命令不再起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一台服务器,会一直在目标服务器终端而不会切回原服务器。
需要注意的是,expect eof 与 interact 只能二选一。
expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1
例子: set time out 30
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执行报错
表示回显命令与echo相同
expect 脚本可以接受从bash命令行传递参数,使用 [lindex $argv n]获得。其中你从0开始,分别表示第一个,第二个,第三个.....参数
${#var}
#返回字符串变量var的字符的长度,一个汉字算一个字符
${var:offset}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset:number}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var: -length}
#取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var:offset:-length}
#从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var: -length:-offset}
#先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length前空格,并且length必须大于offset
${var#*word}
#其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右#同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}
${var%word*}
#其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第一个word为界删右留左
${var%%word*}
#同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向左的最后一个word为界删右留左
${var/pattern/substr}
${变量/搜索的字符串/修改的字符串}
#查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之${var//pattern/substr}
#查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之${var/#pattern/substr}
#查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
# 在 此处 #代表开头
${var/%pattern/substr}
#查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
# 在此处 % 代表结尾
${var/pattern}
#删除var表示的字符串中第一次被pattern匹配到的字符串${var//pattern}
删除var表示的字符串中所有被pattern匹配到的字符串${var/#pattern}
删除var表示的字符串中所有以pattern为行首匹配到的字符串${var/%pattern}
删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串
${var^^}
#把var中的所有小写字母转换为大写
${var,,}
#把var中的所有大写字母转换为小写
eval命令
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描
mktemp 命令用于创建并显示临时文件,可避免冲突
格式:
mktemp [OPTION]... [TEMPLATE]
说明:TEMPLATE: filenameXXX,X至少要出现三个
常见选项:
-d #创建临时目录
-p DIR或--tmpdir=DIR #指明临时文件所存放目录位置
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 目录