#expect #terminal #pty #child-process #automation #command-line-interface

expectrl

类似于Don libes expect的Unix-like系统中自动化终端应用程序的工具

12个版本 (6个重大更改)

0.7.1 2023年7月3日
0.7.0 2023年3月30日
0.6.0 2022年9月24日
0.5.2 2022年6月8日
0.1.3 2021年7月30日

#52 in 测试

Download history 743/week @ 2024-03-14 667/week @ 2024-03-21 606/week @ 2024-03-28 868/week @ 2024-04-04 663/week @ 2024-04-11 652/week @ 2024-04-18 919/week @ 2024-04-25 910/week @ 2024-05-02 977/week @ 2024-05-09 887/week @ 2024-05-16 849/week @ 2024-05-23 1026/week @ 2024-05-30 728/week @ 2024-06-06 1052/week @ 2024-06-13 1137/week @ 2024-06-20 978/week @ 2024-06-27

每月4,054次下载
13 crates 中使用

MIT 许可证

190KB
4K SLoC

Build coverage status crate docs.rs

expectrl

Expectrl是一个自动化终端应用程序的工具。

Expectrl是一个用于启动子应用程序并控制它们以及响应进程输出的预期模式的Rust模块。Expectrl的工作方式类似于Don Libes的Expect。Expectrl允许您的脚本启动子应用程序并像人类输入命令一样控制它。

使用此库,您可以

  • 启动进程
  • 控制进程
  • 与进程的I/O(输入/输出)交互。

expectrl类似于原始的expect,在处理交互式应用程序时可能会很出色。如果您的应用程序不是交互式的,您可能不会认为这个库是最好的选择。

用法

expectrl添加到您的Cargo.toml文件中。

# Cargo.toml
[dependencies]
expectrl = "0.7"

一个示例,其中程序模拟用户与ftp交互。

use expectrl::{spawn, Regex, Eof, 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)?;
    Ok(())
}

相同的示例,但密码将从stdin读取。

use std::io::stdout;
use expectrl::{
    interact::{actions::lookup::Lookup, InteractOptions},
    spawn, stream::stdin::Stdin,
    ControlCode, Error, Regex,
};

fn main() -> Result<(), Error> {
    let mut auth = false;
    let mut login_lookup = Lookup::new();
    let opts = InteractOptions::new(&mut auth).on_output(|ctx| {
        if login_lookup
            .on(ctx.buf, ctx.eof, "Login successful")?
            .is_some()
        {
            **ctx.state = true;
            return Ok(true);
        }

        Ok(false)
    });

    let mut p = spawn("ftp bks4-speedtest-1.tele2.net")?;

    let mut stdin = Stdin::open()?;
    p.interact(&mut stdin, stdout()).spawn(opts)?;
    stdin.close()?;

    if !auth {
        println!("An authefication was not passed");
        return Ok(());
    }

    p.expect("ftp>")?;
    p.send_line("cd upload")?;
    p.expect("successfully changed.")?;
    p.send_line("pwd")?;
    p.expect(Regex("[0-9]+ \"/upload\""))?;
    p.send(ControlCode::EndOfTransmission)?;
    p.expect("Goodbye.")?;
    Ok(())
}

有关更多示例,请查看示例目录。

特性

  • 它支持异步(要启用它们,您必须打开异步功能)。
  • 它支持日志记录。
  • 它支持交互功能。
  • 它在Windows上运行。

注意

它最初受到philippkeller/rexpectpexpect的启发。

MIT许可证下许可

依赖项

~4–36MB
~501K SLoC