目录
一、Here Document
1、交互与免交互
-
交互(Interactive)
交互指的是程序在运行过程中需要与用户进行实时沟通和数据交换。用户可以在程序执行期间提供输入,程序会根据这些输入动态地调整其行为或输出结果。
-
免交互(Non-interactive)
免交互指的是程序在运行过程中不需要与用户进行实时的沟通或输入。所有必要的数据或指令在程序开始时就已经提供,程序会根据这些预设的数据自动执行任务,而无需用户进一步的干预。
2、Here Document 概述
使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
HereDocument是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。
基本语法格式
命令 <<标记
...
...
...
标记
注意事项:
- 标记可以使用任意的合法字符;
- 结尾的标记一定要顶格写,前面不能有任何字符;
- 结尾的标记后面也不能有任何字符(包括空格);
- 开头的标记前后的空格会被省略。
二、Here Document实例
1、cat命令重定向
直接把输入的命令输出

输入保存到文件
追加输入保存到文件

2、 read 命令接收输入并打印
read命令只会读取输出的第一行的内容作为 i 的值

3、 passwd 给用户设置密码

4、变量设定
在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。
- 支持变量替换
在写入文件时会先将变量替换成实际值,再结合cat命令完成写入
[root@localhost ~]# vim ky37.sh
#!/bin/bash
doc_file="ky37.txt"
i="ky37"
cat > $doc_file << EOF
Welcome to Class $i
EOF
echo "this is $i classroom"

整体赋值给一个变量,然后通过 echo 命令将变量值打印出来。
[root@localhost ~]# vim myvar.sh
#!/bin/bash
ivar="Great! Beautyful!"
myvar=$(cat <<EOF
This is Line 1.
That are Sun,Moon and Stars.
$ivar
EOF
)
echo "$myvar"

三、Expect
1、Expect概述
1.1、Expect概念与作用
概念:
Expect 是一个用于自动化交互式程序的工具和库,它允许用户编写脚本来控制需要人工输入的程序。这些程序通常包括命令行工具、网络协议客户端、终端应用等。Expect 使得可以自动化与这些程序的交互,从而简化了重复性任务和测试过程。
作用:
-
自动化登录过程: Expect 可以自动化系统登录、SSH 连接、FTP 登录等过程,省去手动输入用户名和密码的步骤。这在需要批量操作或定期自动登录时特别有用。
-
自动化命令执行: 对于需要输入命令并等待输出的程序(如远程终端、配置管理工具等),Expect 可以自动发送命令并处理响应,完成预定的任务。
-
自动化测试: Expect 可以用来自动化测试需要用户交互的应用程序,例如图形用户界面(GUI)程序或命令行工具,确保它们在各种条件下正常运行。
-
批处理操作: Expect 能够处理需要用户输入的批处理任务,如安装程序的自动化配置、远程主机的批量操作等。
-
处理复杂交互: 对于具有复杂交互逻辑的程序(如多步骤的配置过程或需动态响应的交互),Expect 能够定义详细的对话流程,自动化处理所有步骤。
1.2、Expect的安装
Expect它是一个程序,所以它也是需要提前安装才可以使用的
rpm -q expect
rpm -q tcl
yum -y install expect //yum或者光盘安装都可
1.3、Expect基本命令
-
脚本解释器
指定脚本使用的解释器是 Expect。 -
spawn
启动一个新进程或会话,并跟踪与该进程的交互。 -
expect
用于判断进程的输出是否匹配指定的模式。如果匹配成功,执行相应的操作;否则,等待超时时间后返回。 -
send
向进程发送字符串,模拟用户输入。通常需要加上回车或换行符。- 可以在同一行中使用
send,需要用{}包围。 - 在换行中使用
send,不需要{}。 - 可以处理多个分支,通过匹配不同模式来发送不同的响应。
- 可以在同一行中使用
-
expect eof
表示等待进程结束,并回到原始用户状态。 -
interact
在脚本执行完成后保持交互状态,将控制权交回给用户,允许手动操作。使用interact后,脚本不会自动返回到原终端。 -
set
设置脚本的超时时间。可以指定具体的时间,或设置为无限制。 -
exp_continue
使expect在匹配模式后继续匹配其他模式,类似于控制语句中的continue。允许进一步的模式匹配和操作。- 使用
exp_continue时,如果后续有expect eof,可能会导致错误,因为进程结束后默认会发送eof。
- 使用
-
send_user
用于回显命令的输出,相当于echo。 -
接收参数
Expect 脚本可以从命令行接受参数,并通过索引获取这些参数,用于脚本中的变量赋值和操作。
2、用Expect编写脚本
2.1、ssh无交互登录到远程服务器
[root@localhost opt]# vim expect.sh
#!/usr/bin/expect
spawn ssh root@172.16.88.11
expect {
"password:"
{ send "CxC666666\r"; }
}
interact

2.2、引用位置变量
执行时需要加位置变量
[root@localhost opt]# vim expect.sh
#!/usr/bin/expect
set user root
set ip [lindex $argv 0]
set pass [lindex $argv 1]
spawn ssh $user@$ip
expect {
"password:"
{ send "$pass\r"; }
}
expect "#"
send "ls\r"
send "ifconfig ens33\r"
send "exit\r"
expect eof

2.3、创建用户并设置用户密码
[root@localhost opt]# vim user.sh
#!/bin/bash
username=$1
useradd $username
/usr/bin/expect <<-EOF
spawn passwd $username
expect {
"密码"
{send "123456\r";exp_continue}
"新的密码"
{send "123456\r";}
}
EOF


1436

被折叠的 条评论
为什么被折叠?



