目录
1. Here Document概述
使用I/O重定向的方式将命令列表提供给交互式程序
语法格式:
命令 <<标记
...
...
标记
1.1 注意参数:
标记可以使用任意合法字符
结尾的标语一定要顶格写,前面不能有任何字符
结尾的标记后面也不能有任何字符(包括空格)
开头标记前后的空格会被省略
1.2 举例:
1.2.1 例1:通过read命令接受输入并打印
[root@localhost ~]# cat <<EOF
> hello
> world
> EOF
hello
world
一般是结合在cat 一起使用
[root@localhost ~]# read a <<EOF
> 220
> EOF
[root@localhost ~]# echo $a
220
1.2.2 例2:挂载光盘:
[root@localhost ~]# cat >yum.repo <<EOF
> [test]
> name=test
> baseurl=file:///mnt
> enabled=1
> gpgcheck=0
> EOF
[root@localhost ~]# cat yum.repo
[test]
name=test
baseurl=file:///mnt
enabled=1
gpgcheck=0
一般是对于多行,写入一个文件,避免免交互
对文件进行操作:
[root@localhost ~]# cat > yum.repo <<EOF
> hello
> EOF
[root@localhost ~]# cat yum.repo
hello
//会覆盖之前的内容
[root@localhost ~]# cat >> yum.repo <<EOF
> hello
> world
> EOF
使用追加
[root@localhost ~]# cat yum.repo
hello
hello
world
1.2.3 例3:通过passwd给用户设置密码
[root@localhost ~]# cat 123.sh
#!/bin/bash
passwd zhangsan <<EOF
123456
123456
EOF
[root@localhost ~]# ./123.sh
更改用户 zhangsan 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
1.2.4 例4:关闭变量替换功能
[root@localhost ~]# cat 123.sh
#!/bin/bash
cat <<'EOF'
$abc
EOF
[root@localhost ~]# ./123.sh
$abc
ps:使用单引号即实现关闭变量替换功能
2. Expect概述
Expect是建立在tcl基础上的一个工具,Expect是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题,对于大规模的linux运维很有帮助,为了模拟这种输入,可以使用Expect脚本
2.1 Expect安装
yum install expect -y
2.2 基本命令
建立在tcl之上的一个工具
用于进行自动化控制和测试
解决shell脚本中交互相关的问题
相关流程参数:
spawn:启动进程,并跟踪后续交互信息
send:向进程发送字符串,用于模拟用户的输入
该命令不能自动回车换行,一般要加、r(回车)
expect
expect的一个内部命令,判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
只能捕捉有spawn启动的进程的输出
interact:执行完成后保持交互状态,把控制权交给控制台
相关内容参数:
Timeout:指定超时时间,过期则继续执行后续指令
单位是:秒
timeout -1为永不超时
默认情况下,timeout是10秒
exp_continue
允许expect继续向下执行指令
send_user
回显命令,相当于echo
相关其他参数:
$argv参数数组
Expect脚本可以接受从bash传递的参数,可以使用[lindex $argc n]获得,n从0开始,分别表示第一个,第二个,第三个…参数
expect脚本必须以interact或expect eof结束,执行自动化任务通常是写expect eof
expect eof是在等待结束标志
2.3 语法
2.3.1 单分支语法
expect "password:" {send "mypassword\r";}
2.3.1 多分支语法
expect "aaa" {send "AAA\r"}
expect "bbb" {send "BBB\r"}
expect "ccc" {send "CCC\r"}
ps:Send命令不具备回车换行功能,一般要加\r或\n
或者是这样子
expect {
"aaa" {send "AAA\r"}
"bbb" {send "BBB\r"}
"ccc" {send "CCC\r"}
}
只要匹配了aaa 或bbb或ccc中的任何一个,执行相应的send语句后就会退出该expect语句
expect {
"aaa" {send "AAA\r";exp_continue}
"bbb" {send "BBB\r";exp_continue}
"ccc" {send "CCC\r"}
}
'exp_continue表示继续后面的匹配,如果匹配了aaa,执行完send语句后还会继续向下匹配bbb'
2.4 举例:
2.4.1 例1:登录ssh
#!/usr/bin/expect
spawn ssh root@192.168.52.12
#spawn 表明要做的事情,相当于一个标识,打开一个进程
expect {
"(yes/no)"
{ send "yes\r"; }
"password:"
{ send "123456\r"; }
}
[root@localhost ~]# ./expect.sh
spawn ssh root@192.168.52.12
The authenticity of host '192.168.52.12 (192.168.52.12)' can't be established.
ECDSA key fingerprint is SHA256:DTZgetIf1qBychspRPffWrffwDPxbHu65m4KeKFOgds.
ECDSA key fingerprint is MD5:23:75:28:21:93:86:26:ed:bf:ea:7d:63:51:a9:26:58.
Are you sure you want to continue connecting (yes/no)? [root@localhost ~vim expect.sh
也可以是以下这种方法:
其中,$argv 0 代表位置变量$1
$argv 1 代表位置变量$2
#!/usr/bin/expect
set user root
set ip [lindex $argv 0]
set pass [lindex $argv 1]
#定义变量
spawn ssh $user@$ip
#spawn 表明要做的事情,相当于一个标识,打开一个进程
expect {
"(yes/no)"
{ send "yes\r"; }
"password:"
{ send "$pass\r"; }
}
#interact
expect "#"
send "ls\r"
send "ifconfig ens33\r"
send "exit\r"
expect eof
#eof 结束符
这里也可以添加进两个参数
进行运行脚本是看不到内容的
[root@localhost ~]# ./expect.sh 192.168.52.12 123456
[root@localhost ~]#
改成1 就可以看到了,还可以进入文件查看过程
2.4.2 例2:创建用户并设置密码
#!/bin/bash
user=$1
password=$2
useradd $user
expect <<EOF
spawn passwd $user
expect "New password:"
send "${password}\r"
expect "Retype new password:"
send "${password}\r"
expect eof;
EOF
2.4.3 例3:利用Expect完成FTP登陆过程
#!/bin/expect -f
set timeout 10
spawn ftp 192.168.52.12
expect "Name"
send "ftp\r"
expect "Password:*"
send "\r"
expect "ftp>*"
interact
expect eof