shell——expect免交互

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值