#expect #pty #testing #terminal #automation

expectrl

A tool for automating terminal applications in Unix like Don libes expect

6 releases (3 breaking)

0.4.0 May 12, 2022
0.3.0 Mar 26, 2022
0.2.0 Oct 7, 2021
0.1.3 Jul 30, 2021

#109 in Testing

Download history 7/week @ 2022-01-27 11/week @ 2022-02-03 3/week @ 2022-02-10 5/week @ 2022-02-17 29/week @ 2022-02-24 17/week @ 2022-03-03 43/week @ 2022-03-10 25/week @ 2022-03-17 23/week @ 2022-03-24 54/week @ 2022-03-31 23/week @ 2022-04-07 2/week @ 2022-04-14 6/week @ 2022-04-21 100/week @ 2022-04-28 138/week @ 2022-05-05 141/week @ 2022-05-12

386 downloads per month
Used in uklid

MIT license

155KB
3.5K SLoC

Build coverage status crate docs.rs

expectrl

Expectrl is a tool for automating terminal applications.

Expectrl is a rust module for spawning child applications and controlling them and responding to expected patterns in process's output. Expectrl works like Don Libes' Expect. Expectrl allows your script to spawn a child application and control it as if a human were typing commands.

Using the library you can:

  • Spawn process
  • Control process
  • Interact with process's IO(input/output).

expectrl like original expect may shine when you're working with interactive applications. If your application is not interactive you may not find the library the best choise.

Usage

A general example where the program simulates a used interacting with ftp.

use expectrl::{spawn, Regex, Eof, WaitStatus, Error};

fn main() -> Result<(), Error> {
    let mut p = spawn("ftp speedtest.tele2.net")?;
    p.expect(Regex("Name \\(.*\\):"))?;
    p.send_line("anonymous")?;
    p.expect("Password")?;
    p.send_line("test")?;
    p.expect("ftp>")?;
    p.send_line("cd upload")?;
    p.expect("successfully changed.\r\nftp>")?;
    p.send_line("pwd")?;
    p.expect(Regex("[0-9]+ \"/upload\""))?;
    p.send_line("exit")?;
    p.expect(Eof)?;
    assert_eq!(p.wait()?, WaitStatus::Exited(p.pid(), 0));
}

The example inspired by the one in philippkeller/rexpect.

For more examples, check the examples directory.

Features

  • It has an async support (To enable them you must turn on an async feature).
  • It supports logging.
  • It supports interact function.
  • It works on windows.

Notes

It was originally inspired by philippkeller/rexpect and pexpect.

Licensed under MIT License

Dependencies

~1–37MB
~615K SLoC