多行重定向,expect,字符串处理,高级变量,脚本工具

一,多行重定向

(一)含义

使用I/O重定向的方式将命令列表提供给交互式程序

标准输入的一种替代品

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

(二)语法格式

语法格式

命令<<   标记

....

......

标记

命令支持cat   tee

注意事项

  1. 标记可以使用任意的合法字符(通用的字符是EOF)

  2. 结尾的标记一定要顶格写,前面不能有任何字符(包括空格)

  3. 结尾的标记后面也不能有任何字符(包括空格)

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

     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 生成目录

(三) 生成随机密码

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值