Shell 编程之Expect免交互

一、Expect 概述

(1)Expect是建立在tcl基础上的一个工具,Expect是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux运维很有帮助。
(2)在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互到的过程,可能会需要输入yes/no password等信息。为了模拟这种输入,可以使用EXpect脚本。

二、Expect 安装

执行安装命令
yum install -y expect

三、Expect 基本命令

3.1、脚本编辑器

expect 脚本中首先引入文件,表明使用的是哪一个shell
#!/usr/bin/expect

3.2、spawn

spawn 后面通常跟一个命令,表示开启一个会话、启动进程,并跟踪后续交互信息。
例:spawn passwd root

3.3、expect

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由spawn启动的进程的输出;用于接收命令执行后的输出,然后和期望的字符串匹配

3.4、send

send:向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车)
例:
case1=“密码”
respond=“abcd123”
expect “$case1” {send KaTeX parse error: Can't use function '\r' in math mode at position 8: respond\̲r̲} 或者 expect "case1"
send “KaTeX parse error: Can't use function '\r' in math mode at position 10: response1\̲r̲" 或 expect { "case1” {send “KaTeX parse error: Can't use function '\r' in math mode at position 10: response1\̲r̲"} "case2” {send “KaTeX parse error: Can't use function '\r' in math mode at position 10: response2\̲r̲"} "case3” {send “$response3\r”}
}

3.5、结束符

(1)expect eof
等待执行结束,退回到原用户,与spawn对应
expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户
(2)interact
执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户,而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一台服务器,会一直在目标服务器终端,而不会切回原服务器。

3.6、set

expect 默认的超时时间是10秒,通过set命令可以设置会话超时时间,若不限制超时时间则应设置为-1。
例:set timeout 30

3.7、exp_continue

exp_continue表示允许expect继续向下执行命令。
例:
expect
{
“aaa” {send “AAA”;exp_continue}
“bbb” {send “BBB”;exp_continue}
“ccc” {send “CCC”}
}

3.8、send_user

send_user表示回显命令,相当于echo

3.9、接收参数

expect脚本可以接收从bash命令行传递的参数,使用[lindex $argv n]获得,其中n从0开始,分别表示第一个,第二个,第三个…参数。
例:set hostname [lindex $argv 0]
set passwd [lindex $argv1]

四、Expect 执行方式

4.1、直接执行

[root@localhost ~]# vim de.sh
#!/usr/bin/expect    //Expect开始标志
 #超时时间
  set timeout 60
  log_file test.log
  log_user 1
#参数传入
  set hostname [lindex $argv 0]
  set passwd [lindex $argv 1]
  #追踪命令
  spawn ssh root@$hostname
  #捕捉信息并且匹配,免交互执行
  expect {
    
    
        "(yes/no)"
        {
    
    send "yes\r";exp_continue}
        "*password"
        {
    
    send "$passwd\r"}
  }
 #控制权交给控制台执行 
interact
[root@localhost ~]# chmod +x de.sh
[root@localhost ~]# ./de.sh 192.168.217.132 123456
12345678910111213141516171819202122

4.2、嵌入执行

[root@localhost ~]# vim sa.sh
#!/bin/bash
#位置变量
hostname=$1
password=$2
/usr/bin/expect <<-EOF
spawn ssh root@${hostname}
expect {
    
    
  "(yes/no)"
  {
    
    send "yes\r";exp_continue}
  "*password"
  {
    
    send "$password\r"}
}
  expect "*]#"
  send "exit\r"
  expect eof
EOF
[root@localhost ~]# chmod +x sa.sh
[root@localhost ~]# ./sa.sh 192.168.217.132 123456

猜你喜欢

转载自blog.csdn.net/weixin_48191211/article/details/108219801