一,多行重定向
(一)含义
使用I/O重定向的方式将命令列表提供给交互式程序
标准输入的一种替代品
Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用
(二)语法格式
语法格式
命令<< 标记
....
......
标记
命令支持cat tee
注意事项
- 标记可以使用任意的合法字符(通用的字符是EOF)
- 结尾的标记一定要顶格写,前面不能有任何字符(包括空格)
- 结尾的标记后面也不能有任何字符(包括空格)
- 开头标记前后空格会被省略掉
5. 单引号 变量双引号 —
(三)多行重定向使用
1,多行重定向 写入文件
会自动生成 1 的文件
2,多行重定向标准输出
就是不加文件名 直接输出到屏幕上
3,多行重定向作用到脚本
4,tee
效果和cat 一致,但是不需要重定向了
二,expect
(一)定义
是建立在tcl(tool command language)语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题
需要装 yum install -y expect
脚本解释器 #!/usr/bin/expect
(二)格式
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
(三)语法
(四) expect中相关命令
1,脚本解释器
expect 脚本中首先引入文件,表明使用的事哪一种shell
#!/usr/bin/expect
2,spawn 启动新的进程(监控,捕捉)
spawn 后面通常跟一个Linux执行命令,表示开启一个会话、进程,并跟踪后续交互信息
例: spawn passwd root
3,expect 从进程接收字符串
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉有swpan启动的进程输出;
用于接受命令执行后的输出,然后和期望的字符串匹配
4,send 用于向进程发送字符串
向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加 \r (回车) 或者\ n
5,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执行报错
6,结束符 interact 允许用户交互expect eof
expect eof
表示交互结束,等待执行结束,退回到原用户,与spawn对应
比如切换到root用户,expect 脚本默认的等待时间是10s,当执行王命令后,默认停留10s后,自动切回原用户.
interact
执行完成后保持交互状态, 把控制权交给控制台,会停留在目标终端而不是退回到原终端,这时候就可以手工操作了,interact后命令不再起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一台服务器,会一直在目标服务器终端而不会切回原服务器。
需要注意的是,expect eof 与 interact 只能二选一。
7,set
设置变量
expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1
例子: set time out 30
8,send_user
表示回显命令与echo相同
9,接收参数(位置变量)
expect 脚本可以接受从bash命令行传递参数,使用 [lindex $argv n]获得。其中你从0开始,分别表示第一个,第二个,第三个.....参数
例子:
set hostname [lindex $argv 0] 相当于hostname=$1
set password [lindex $argv 1] 相当于passswd=$2
expect直接执行,需要expect命令去执行脚本
su切换用户
(五)expect 使用示例
1,捕捉屏幕上的输出 出现hi 发送指定内容
2,脚本里写 scp 连接时,免密登录
注意:
scp 远程拷贝
sftp 文件传输
ssh 远程连接
rsync 文件同步
这四个都用ssh协议
手搓脚本
运行脚本
去到 另一台机器
、
3,scp 一次 yes 都不打的方法
改客户端配置文件
4,expect eof interact 区别
expect eof 会退回去
interact 不会退回去
5,切换用户脚本
先手搓一个脚本
运行脚本,加用户名和密码 两个位置参数
当我们且到 root 时 会捕捉搭配 ]# 就会发送 hello root
6, ssh远程连接免密
把root@192.168.217.77 看做 $1
123 密码 看做 $2
7, 免交互远程批量创建用户
#!/bin/bash net=192.168.91 password=123123 iplist=" 101 102 " for i in $iplist do ip=$net.$i /usr/bin/expect <<EOF spawn ssh root@$ip expect { "(yes/no)" {send "yes\r";exp_continue} "*password" {send "$password\r"} } expect "*]#" { send "useradd test\n" } expect "*]#" { send "echo 123123 |passwd --stdin test\r" } expect "*]#" { send "exit\r" } expect eof EOF done
三,字符串处理
(一)字符串切片
1,基于偏移量取字符
1.1 取字符串的长度
${#var}
#返回字符串变量var的字符的长度,一个汉字算一个字符
例子:
[root@localhost ~]#str=abc123你好
#定义变量
[root@localhost ~]#echo ${#str}
#使用 字符公式取长度
8
1.2 跳过左边的字符
即 跳过前n 个字符 取后面m个字符
例子:跳过前两个 往后数三个
1.3 取字符串右边的字符
例子:取后两个字符
1.4 掐头去尾
例子:跳过前3 跳过后面两个 掐头去尾
1.5 取倒数的范围
例子:从倒数第3 到倒数第二
2,基于模式取子串
2.1 删左留右 懒惰模式
例子: 删 第一个: 左边的内容 留:右边的内容
2.2 删左留右 贪婪模式(匹配到最后一个 )
例子:
2.3删右留左 懒惰模式
例子:
2.4 删右留左 贪婪模式
例子:
(二)查找替换
1,规则
${var/pattern/substr}
${变量/搜索的字符串/修改的字符串}#查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之
${var//pattern/substr}
#查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之
${var/#pattern/substr}
#查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
# 在 此处 #代表开头
${var/%pattern/substr}
#查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
# 在此处 % 代表结尾
2,例子
2.1 查找用户李四
此处可知 getent passwd lisi 等同于在 passwd文件中 过滤lisi
我们定义变量 ustat=getent passwd lisi
2.2 懒惰模式 把李四换成123
2.3 贪婪模式 把李四都 去掉
2.4 #只换开头
2.5 % 只换结尾
(三)大小写转换
1,规则
${var^^}
#把var中的所有小写字母转换为大写
${var,,}
#把var中的所有大写字母转换为小写
2,例子
^^ 换成大写
,, 换成小写
四,高级变量
(一)高级变量赋值
例子:
[root@localhost ~]#unset str;var=${str-lucky}
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#echo $var
lucky
[root@localhost ~]#str=" ";var=${str-lucky}
[root@localhost ~]#echo $var
[root@localhost ~]#str="1";var=${str-lucky}
[root@localhost ~]#echo $var
1
(二) 变量的间接引用
eval命令
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描
[root@localhost ~]#n=10
[root@localhost ~]#echo {1..$n}
{1..10}
[root@localhost ~]#eval echo {1..$n}
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]#i=a
[root@localhost ~]#j=1
[root@localhost ~]#$i$j=hello
bash: a1=hello: 未找到命令...
[root@localhost ~]#eval $i$j=hello
[root@localhost ~]#echo $a1
hello
五,其他脚本工具
(一) 创建临时文件mktemp
1,格式
mktemp [OPTION]... [TEMPLATE]
说明:TEMPLATE: filenameXXX,X至少要出现三个
2,常见选项
-d #创建临时目录
-p DIR或--tmpdir=DIR #指明临时文件所存放目录位置
3,例子
4,作用
实现垃圾箱分类
(二) 安装复制文件install
install 功能相当于cp,chmod,chown,chgrp ,mkdir 等相关工具的集合
1,格式
install [OPTION]... [-T] SOURCE DEST 单文件
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY... #创建空目录
2,选项
-m MODE,默认755
-o OWNER
-g GROUP
-d DIRNAME 目录
3,例子
3.1 当复制用
3.2 生成目录
(三) 生成随机密码