expect - 捕捉 shell 输出,自动交互的工具

install

1
2
3
4
# mac 安装
brew install expect
# linux 安装
yum install expect

usage

两种调用方式

  • 直接使用 expect 解释器

    TODO 此情况下无法使用变量

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    #!/usr/bin/expect
    
    set timeout -1 				# 设置expect会话捕捉超时时间, 默认 10 sec, 设为 -1,没有超时
    
    # SSH 连接
    spawn ssh root@127.0.0.1	# spawn 后加要执行的命令
    expect "password:"			# 使用 expect 进行捕捉, 当输出为 password: 时执行 send 动作 
    send "pwd\r"				# send 后加要输入的字符串, 使用 `send --` 来输入含有特殊字符的字符串
    
    interact					# 控制权转交给人工
    
  • 在 bash shell 内执行

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #!/bin/bash
    
    set timeout -1
    
    ssh_pwd=pwd
    
    # SSH 连接
    /usr/bin/expect <<-EOF 		# 使用 expect 解释器
    spawn ssh root@127.0.0.1	
    # 使用 expect 进行捕捉,格式为 “捕捉字符串” {捕捉到需执行操作}
    # 加上;exp_continue 表示还需要继续保持捕捉动作(会话)
    expect {
    	# "Password:" {send "$sudo_pwd\r";exp_continue}
    	"password:" {send "$ssh_pwd\r"}
    	# 在这次的 expect 内存在 timeout, spawn 后的命令会自动退出, 也就是说本次的 SSH 连接会自动断开
    	timeout {exit 127}
    }
    
    expect eof
    EOF