在 Rust 和流响应中发送 SSH 命令

sending ssh commands in rust and stream response

提问人:Th0rgal 提问时间:11/17/2023 更新时间:11/17/2023 访问量:13

问:

我正在尝试使用 rust 在通过 SSH 连接到的服务器上执行命令。我希望能够读取命令的结果(并在运行命令后将服务器上打印的每一行流式传输到客户端)。我尝试了从 ssh2 开始的多个库,不幸的是它不允许我流式传输响应。我听说过async_ssh2,特别是async_ssh2_lite。我在网上找不到很多例子,但我可以在我复制的人的旧分支中看到一个演示:

use crate::config::Config;

use std::io;
use std::net::SocketAddr;
use std::net::TcpStream;
use async_io::Async;
use async_ssh2_lite::AsyncSession;
use std::str::FromStr;

pub async fn execute_actions(config: Config, skip: Option<Vec<String>>) -> io::Result<()> {
    let addr = SocketAddr::from_str(&config.server.host).expect("Invalid host address format");
    let stream = Async::<TcpStream>::connect(addr).await?;
    let mut session = AsyncSession::new(stream, None)?;

    session.handshake().await?;
    Ok(())
}

不幸的是,这似乎不起作用,因为我在以下方面出现错误:.handshake()

the method `handshake` exists for struct `AsyncSession<Async<TcpStream>>`, but its trait bounds were not satisfied
the following trait bounds were not satisfied:
`async_io::Async<std::net::TcpStream>: AsyncSessionStream`

我不确定如何解决这个问题,网上的人似乎认为这是因为缺少 async-io 功能,但添加它无济于事:

async-ssh2-lite = { version = "0.4.7", features = ["async-io", "tokio"] }
异步 Rust SSH

评论


答: 暂无答案