Skip to content

自动化

Expect

前置知识:CLI 原理

要理解 Expect 的工作原理,我们必须深入了解几个终端知识:tty、pty。

  • TeleTYpewriter:原指电传打字机,接收键盘输入并打印输出的设备,位于 /dev/tty*
  • Pseduo-TTY:伪终端,
    • 由内核创建的一对设备,有主端(master)和从端(slave)。
    • slave 看起来像一个真正的 TTY 设备,shell 等程序将其作为输入输出。位于 /dev/pts/N
    • master 由终端模拟器,如 xterm、ssh、Expect 使用,用于与用户交互并转发数据。通过 /dev/ptmx 动态创建。

spawn

spawn [args] program [args]
  • stdin、stdout、stderr 均重定向到 Expect
  • 使用 close 关闭,或者进程自己退出
  • 成功创建进程后设置变量 spawn_id,并视为当前进程
  • 全局变量

    user_spawn_id
    error_spawn_id
    tty_spawn_id
    
    • user_spawn_id 指向用户
    • 如果 spawn_id = user_spawn_id,则命令作用于用户,如 expect -> expect_user
  • 返回 UNIX PID

send

send [-flags] string

默认发送到变量 spawn_id,可以用 -i 指定发送到特定 spawn_id

expect

expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]

close

close [-slave] [-onexec 0|1] [-i spawn_id]

关闭到进程的连接。大部分交互式进程会检测到 EOF 并退出。

expectinteract 会自动检测当前进程退出,并隐式执行 close。但如果使用 exec kill 等方式关闭,则需要手动 close

  • -onexec:执行新 spawn 时,是否应该关闭当前的 spawn_id0 保留。默认不保留。

不论以什么方式执行 close,都应当再调用 wait 等待进程结束。

wait

wait [args]
  • -i
  • -nowait