1、expect 概述:
(1)expect 是创建在 tcl 基础上的一个工具,expect是用来进行自动化控制和测试的工具,主要解决shell脚本中不可交互的问题。对于大规模的linux运维颇有帮助
(2)在linux 运维和开发中,咱们常常须要远程登陆服务器进行操做,登陆的过程是一个交互的过程,可能会须要输入yes/no password等信息。为了模拟这种输入,可使用expect脚本。
(3)安装linux
yum install expect -yshell
2、基本命令:
(1)send:向进程发送字符串,用于模拟用户的输入(该命令不能自动回车换行,通常要加 \r (回车))
(2)expect :判断上次输出结果里是否包含指定的字符串,若是有则当即返回,不然就等待超时时间后返回,只能捕捉由 spawn 启动的进程的输出。
(3)sapwn :启动进程,并跟踪后续交互信息 。
(4)interact :执行完成后保持交互状态,把控制权交给控制台。
(5)timeout : 指定超时时间,过时则继续执行后续指令。数组
单位为:秒
timeout -1 为永不超时
默认状况下,是10秒bash
(6)exp_continue :容许expect 继续向下执行指令
(7)send _user :至关于echo
(8)$argv 参数数组: expect脚本能够接受从bash传递的参数,可使用 [lindex $argv n ] 得到
(9)expect 脚本必须以interact 或 expect eof 结束,执行自动化任务一般 expect eof 就够了服务器
expect eof 是在等待结束标志,由spawn 启动的命令在结束时会产生一个 eof标记,expect eof 即在等待这个标记。运维
3、expect 执行方式:
(1)直接执行:
例子:ssh 远程登陆,免交互输入用户名和密码。ssh
1 #!/usr/bin/expect //expect 二进制文件的路径 2 set timeout 20 //超时时间 3 log_file test.log 4 log_user 1 5 6 set hostname [lindex $argv 0] //0表示第一个参数 7 set password [lindex $argv 1] //1 表示第二个参数 8 spawn ssh root@$hostname //启动进程,并跟踪 9 10 expect { //捕捉进程 11 "(yes/no)" 12 {send "yes\r";exp_continue} 13 "*password" 14 {send "$password\r"} 15 } 16 17 interact //将控制权交给控制台
嵌入使用ide
1 #!/bin/bash 2 ip=$1 3 password=$2 4 5 /usr/bin/expect<<-EOF 6 7 spawn ssh root@${ip} 8 expect { 9 "(yes/no)" 10 {send "yes\r";exp_continue} //键盘输入yes 并继续 11 "*password" 12 {send "$password\r"} 13 } 14 expect "*]#" 15 send "exit\r" 16 expect eof 17 EOF 18
**
案例一:建立一个用户zhang,密码为123123工具
** 1 #!/bin/bash 2 yonghu=$1 3 mima=$2 4 useradd $yonghu //建立用户 5 /usr/bin/expect <<-EOF 6 spawn passwd $yonghu 7 expect { 8 "新的 密码:" 9 {send "$mima\r";exp_continue} 10 "从新输入新的 密码" 11 {send "$mima\r"} 12 } 13 EOF**