#async-io #tube #pwntools #tokio #tubes

io-tubes

为 Rust 异步 io 提供类似 pwntools tube 的功能

5 个版本

0.1.1 2022 年 8 月 29 日
0.1.0 2022 年 8 月 22 日
0.0.3 2022 年 8 月 19 日
0.0.2 2022 年 8 月 16 日
0.0.1 2022 年 8 月 15 日

#944异步

MIT 许可证

25KB
535 代码行

io-tubes

Crates.io docs.rs

提供类似于 Python 库 pwntools 的 tube 功能。

更多示例和文档可以在 docs.rs 找到

示例

use io_tubes::tubes::Tube;
use std::io;

#[tokio::main]
async fn main() -> io::Result<()> {
    let mut p = Tube::process("/usr/bin/cat")?;

    // "Hello World!" will be automatically converted to `&[u8]`
    // Alternatively, you can explicitly use b"Hello World!" if it contains invalid UTF-8.
    p.send("Hello World!").await?;

    // You can use any type that implements `AsRef<[u8]>`
    let output = p.recv_until(b"World".to_vec()).await?;
    assert_eq!(output, b"Hello World");
    Ok(())
}

lib.rs:

管道

提供类似于 Python 库 pwntools 的 tube 功能。

方法在结构体 Tube 中提供

示例

use io_tubes::tubes::Tube;
use std::io;

#[tokio::main]
async fn demo() -> io::Result<()> {
    let mut p = Tube::process("/usr/bin/cat")?;

    // "Hello World!" will be automatically converted to `&[u8]`
    // Alternatively, you can explicitly use b"Hello World!" if it contains invalid UTF-8.
    p.send("Hello World!").await?;

    // You can use any type that implements `AsRef<[u8]>`
    let output = p.recv_until(b"World".to_vec()).await?;
    assert_eq!(output, b"Hello World");
    Ok(())
}

demo();

任何实现 AsyncRead + AsyncWrite 的类型都可以使用 Tube::new 创建一个新的管道。

use io_tubes::tubes::{Listener, Tube};
use std::io;
use tokio::net::TcpStream;

#[tokio::main]
async fn create_remote() -> io::Result<()> {
    let l = Listener::bind("0.0.0.0:1337").await?;

    // The followings are equivalent `Tube<BufReader<TcpStream>>`.
    let mut p = Tube::remote("127.0.0.1:1337").await?;
    let mut p = Tube::new(TcpStream::connect("127.0.0.1:1337").await?);

    Ok(())
}

create_remote();

依赖关系

~2.4–8.5MB
~59K SLoC