Shell编程 ------ Expect免交互

一、expect 概述:

(1)expect 是建立在 tcl 基础上的一个工具,expect是用来进行自动化控制和测试的工具,主要解决shell脚本中不可交互的问题。对于大规模的linux运维很有帮助

(2)在linux 运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息。为了模拟这种输入,可以使用expect脚本。

(3)安装

  • yum install expect -y

二、基本命令:

(1)send:向进程发送字符串,用于模拟用户的输入(该命令不能自动回车换行,一般要加 \r (回车))

(2)expect :判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由 spawn 启动的进程的输出。

(3)sapwn :启动进程,并跟踪后续交互信息 。

(4)interact :执行完成后保持交互状态,把控制权交给控制台。

(5)timeout : 指定超时时间,过期则继续执行后续指令。

  • 单位为:秒
  • timeout -1 为永不超时
  • 默认情况下,是10秒

(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 即在等待这个标记。

三、expect 执行方式:

(1)直接执行:
例子: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 //将控制权交给控制台

脚本执行效果如下:
Shell编程 ------ Expect免交互_第1张图片
(2)嵌入执行:

 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 

脚本执行结果:
Shell编程 ------ Expect免交互_第2张图片

四、案例展示:

案例一:创建一个用户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

脚本执行效果:
Shell编程 ------ Expect免交互_第3张图片
案例二:利用 expect完成 ftp登录过程

  1 #!/bin/bash
  2 ip=$1
  3 /usr/bin/expect<<-EOF
  4 spawn ftp $ip 
  5 expect {
  6         "Name*"
  7         {send "ftp\r";exp_continue}
  8         "Password:*"
  9         {send "\r";exp_continue}
 10         "ftp>*"
 11         {send "bye\r"}
 12 }
 13 EOF

脚本效果显示:
Shell编程 ------ Expect免交互_第4张图片

你可能感兴趣的:(shell脚本)