Linux ---- Shell编程之免交互

一、Here Document 多行重定向

1、Here Document定义

  • 使用I/O重定向的方式将命令列表提供给交互式程序
  • 标准输入的一种替代品
  • Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用。

2、基本语法格式

  • 特殊字符"<<"在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的 stdin。

  • 标记的选择要确保不会出现在其他地方,避免出现混淆。

  • 两个标记之间的内容被当做是一个文件并用作"命令"的标准输入。

  • 另外 Here Document 也可以与非交互式程序和命令一起使用。

    命令<< 标记

    ....

    ......

    标记

注意事项:

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

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

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

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

  5. 单引号 变量双引号 ---

3、wc -l 统计

使用 wc -l 命令后面直接跟文件名就可以统计文件内有多少行内容,将要统计的内容置于标记"EOF" 之间,直接将内容传给 wc -l 来统计。

复制代码
[root@localhost ~]#wc -l <<EOF
> abc
> def
> ghj
> EOF
3

4、tee命令

选项:

|----|----------------|
| -a | 内容追加到给定的文件而非覆盖 |
| -i | 忽略中断信号 |

直接进行文件,不需要 >

5、read命令

6、应用实例

1.直接把输入的内容从命令行输出

复制代码
[root@localhost /home]#cat <<EOF
> hello 
> moto
> EOF
hello 
moto

2.输入保存到文件中

复制代码
[root@localhost /home]#cat >name<<EOF
> zhangsan
> lisi
> wangwu
> EOF
[root@localhost /home]#cat name
zhangsan
lisi
wangwu

3.追加输入保存到文件

复制代码
[root@localhost /home]#cat >>name<<EOF
> xiaoming
> EOF
[root@localhost /home]#cat name 
zhangsan
lisi
wangwu
xiaoming

4.对行数进行统计

复制代码
[root@localhost /home]#wc -l <<EOF
> test1
> test2
> test3
> EOF
3

5.给变量赋值

复制代码
#通过read 命令接收输入并打印,输入值是两个EOF标记之间的部分,作为变量 a 的值
[root@localhost /home]#read a <<EOF
> 8
> EOF
[root@localhost /home]#echo $a
8

6.免交互设置密码

复制代码
[root@localhost /home]#useradd laowang
[root@localhost /home]#passwd laowang <<EOF
> 123456
> 123456
> EOF
更改用户 laowang 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

7. 变量替换

复制代码
[root@localhost /home]#vim test.sh
#!/bin/bash
doc_file="gkd.txt"
i="nanjing"
cat > $doc_file <<EOF
welcome to $i
EOF

[root@localhost /home]#sh test.sh 
[root@localhost /home]#cat gkd.txt 
welcome to nanjing

8.整体赋值给变量,用echo将变量值打印出来

复制代码
[root@localhost /home]#vim test2.sh
#!/bin/bash
test="you are very good!"
mylife=$(cat <<EOF 
冲冲冲!
干就完了!!!
$test
EOF
)
echo $mylife

[root@localhost /home]#sh test2.sh 
冲冲冲! 干就完了!!! you are very good!

9.关闭变量替换的功能

复制代码
#对标记加单引号,即可关闭变量替换
[root@localhost /home]#aa=$(cat <<'EOF'
> 10
> $a
> EOF
> )
[root@localhost /home]#echo $aa
10 $a
[root@localhost /home]#echo $a
8

10.去掉每行之前的 TAB 字符

复制代码
[root@localhost /home]#vim test3.sh
#!/bin/bash
cat <<EOF
        hello
EOF
cat <<EOF
        word
EOF

[root@localhost /home]#sh test3.sh 
	hello
	word

[root@localhost /home]#vim test3.sh     #EOF前面添加"-"能够去掉行首的tab制表符
#!/bin/bash
cat <<-EOF
        hello
EOF
cat <<-EOF
        word
EOF

[root@localhost /home]#sh test3.sh     #加了"-"以后显示出的内容就会顶格显示
hello
word

11.多行注释

  • Bash 的默认注释是"#",该注释方法只支持单行注释,在 Shell 脚本的工作中,"#"右侧的任何字符串,bash 都会将其忽略。

  • " : "代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。

    [root@localhost /home]#vim test4.sh

    #!/bin/bash
    : <<EOF #冒号表示多行注释,开头的标记内容不会被执行
    hello?
    who are you?
    EOF
    echo "What is the matter with you?"

    [root@localhost /home]#sh test4.sh
    What is the matter with you?

二、expect 免交互

1、概述

expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。

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

2、安装环境

expect 并非是 shell 能够解释的,所以想要执行它来完成你的脚本,你需要先安装两个软件包,当然,在使用yum的情况下,我们执行这条命令就可以了。

复制代码
[root@localhost /home]#yum install -y expect

格式:

复制代码
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]

expect中相关命令

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

    spawn passwd root ###捕捉命令

  • expect 从进程接收字符串

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

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

  • interact 允许用户交互expect eof

3、expect基本使用

1.脚本解释器的声明

2.spawn启动进程并捕捉交互信息

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

3.expect从进程接受字符串

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

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 或者 interact 只能二选一)

Ⅰ expect eof
  • 表示交互结束,等待执行结束,退回到原用户,与 spawn 对应。
  • 比如切换到 root 用户,expect 脚本默认的是等待10s当执行完命令后,默认停留10s后,自动切回了原用户
Ⅱ interact
  • 执行完后保持交互状态,把控制权交给控制台会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact 后的命令不起作用;
  • 使用 interact 会保持在终端而不会退回到原终端;

6.exp_continue

exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。

exp_continue 类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。

并行执行,exp_continue 前面的匹配如果有就执行,没有就不执行;但后面的一定会执行。

7.set 设置会话超时时间

expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1。

8.send_users

表示回显命令

9.接受参数

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

4、expect免交互的脚本运用

1.免交互传输文件

2.免交互修改用户密码

3.通过位置变量传入获取值,修改用户密码

4.嵌入式执行模式修改用户密码

嵌入执行模式,将expect过程融入Shell 当中,方便执行和处理;但是像ssh、su这种会切换环境的交互式命令一般不建议使用嵌入执行模式。

5.su命令切换用户

复制代码
./test4  zhangsan 123

6.远程登录

7.fdisk 分区操作

还没完,等后续哦

相关推荐
安全系统学习3 小时前
网络安全之RCE分析与利用详情
服务器·网络·安全·web安全·系统安全
longze_73 小时前
Ubuntu连接不上网络问题(Network is unreachable)
linux·服务器·ubuntu
Dirschs3 小时前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros
qianshanxue114 小时前
ubuntu 操作记录
linux
风吹落叶花飘荡6 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
AmosTian6 小时前
【系统与工具】Linux——Linux简介、安装、简单使用
linux·运维·服务器
YC运维7 小时前
RIP实验以及核心原理
运维·网络·智能路由器
阿蒙Amon7 小时前
C#随机数生成全面详解:从基础到高级应用
服务器·网络·c#
leo__5208 小时前
自动化运维:使用Ansible简化日常任务
运维·自动化·ansible