前言:
expect 用途
设置账号密码
ssh输入登陆密码
scp 输入验证密码
免交互的目的是代替人工手动输入
- expect概述
- expect安装
- expect基本命令
- expect执行方式
- expect案例
一 : expect 概述
1.1 expect
- expect是建立在tcl基础上的一个工具,expect是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux运维很有帮助
- 在linux运维和开发中,我们经常需要远程登陆服务器进行操作,登陆的过程是一个交互的过程,可能会需要输入yes/no、password等信息。为了模拟这种输入,可以使用expect脚本
二 : expect 安装
2.1 挂载光盘
2.2 制作本地yum仓库
2.3 执行安装命令
- yum install expect -y
- 系统在默认情况下是没有安装expect软件,需要手动安装
三 : expect基本命令
3.1 spawn : 启动进程,并跟踪后续交互信息
3.2 expect
- expect的一个内部命令,判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超过时间后返回。
- 只能捕捉由spawn启动的进程的输出
3.3 send :向进程发送字符串,用于模拟用户的输入
- 该命令不能自动回车换行,一般要加\r(回车)
3.4 interact : 执行完成后保持交互状态,把控制权交给控制台
3.5 Timeout :指定超时时间,过期则继续执行后续指令
- 单位是:秒
- timeout -1 为永不超时
- 默认情况下,timeout是10s
3.6 exp_continue
- 允许expect继续向下执行指令
3.7 send_user
- 回显命令,相当于echo
备注:
- 永不超时常用于网络不稳定时使用
- shell脚本中的continue 指结束这次循环,开始下一次循环
- expect脚本中exp_continue指不会结束,继续匹配下一行
3.8 $argv 参数数组
- expect 脚本可以接受从bash传递的参数,可以使用[lindex $argv n]格式,去进行获得,n从0开始,分别表示第一个,第二个,第三个……参数
- v 代表value 值,前面是固定格式
- agv 与n 中间要有空格
3.9 expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就足够了
- expect eof 是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记
- 看到eof 即代表结束脚本
四 : expect 语法
-
expect “要捕捉的内容” {send “要输入的参数\r”;}
-
\r 回车符
-
没有带有exp_continue ,则匹配一次就推出,有的话就再往下执行匹配一次
-
-re 参数表示匹配正则表达式
五 : experct 执行方式
5.1 直接执行
[root@localhost ~]# vim a.sh
#!usr/bin/ecpect //expect二进制文件的路径,
#设置环境
#超时时间
set timeout 9 //设置超时时间
log_file test.log //日志文件路径
log_user 1 //用户数量为1
#定义变量
set hostname [lindex $argv 0 ]
set password [lindex $argv 1 ]
#开启追踪spawn
spawn ssh root@$hostname //spawn 启动命令
#匹配条件,捕捉
expect { //按条件捕捉去send执行
"(yes/no)"
{send "yes\r";exp_continue}
"*passwor"
{send "$password\r"}
}
#权限转交控制台
interact
[root@localhost ~]# chmod +x a.sh
[root@localhost ~]# ./a.sh $argv0 $argv1
-
interact不要写在大括号里面
-
[gsy@localhost root]$ which expect /usr/bin/expect
-
两个log可加可不加
-
set两个变量代表着传参
-
然后以spawn 去开启服务
-
exprct 去捕捉条件,中间send输出指令,\r回车,exp_continue继续匹配
-
interact结束
5.2 嵌入执行
[root@localhost ~]# vim b.sh
#!/bin/bash
hostname=$1
password=$2
/usr/bin/expect<<-EOF //expect开始EOF标志
spawn ssh root@$hostname
expect {
"(yes/no)"
{send "yes\r";exp_continue}
"*password"
{send "$password\r"}
}
expect "*]#" //检索是否以root登陆
send "exit\r"
expect eof
EOF //exprct结束标志,这个EOF不能有空格
[root@localhost ~]# source b.sh
-
java的全局变量指的是类文件为区域
-
shell的是所有bash环境都能识别
-
/usr/bin/expect<<-EOF 也可以视为声明expect 位置
-
EOF前后不能有空格
spawn :以spawn模式执行操作,expect 才可以捕捉到
六 : expect 案例
6.1 创建用户tom,密码123123
- 正常情况下的交互过程
- 编写shell脚本(嵌入方式)
[root@localhost ~]# vim b.sh
#!/bin/bash
user=$1
mima=$2
/usr/bin/expect<<-EOF
spawn useradd $user
spawn passwd $user
expect {
"New password"
{send "$mima\r";exp_continue}
"new password"
{send "$mima\r"}
}
expect eof
EOF
[root@localhost ~]# chmod +x b.sh
[root@localhost ~]# ./b.sh qqq 965483
spawn useradd qqq
spawn passwd qqq
Changing password for user qqq.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]# vim b.sh
[root@localhost ~]# id qqq
uid=1001(qqq) gid=1001(qqq) groups=1001(qqq)
6.2 ssh登录
- 首次登录
-
正常登录
-
连接被拒绝,可能是ssh没开,或者端口不对,或者防火墙限制
- 没有连接地址
- 利用expect完成ssh登录过程
6.3 利用expect完成ftp登录过程
想要注释多行语句 可以在首部输入 :<<! 在尾部输入!