#tui #ssh #cursive #terminal

ssh_ui

轻松将 Rust TUI 应用程序暴露在 ssh 上

6 个版本 (3 个破坏性更新)

0.4.1 2023 年 1 月 29 日
0.4.0 2023 年 1 月 27 日
0.3.1 2023 年 1 月 25 日
0.2.0 2023 年 1 月 24 日
0.1.0 2023 年 1 月 23 日

命令行界面 中排名 750

每月下载 23

MIT 许可证

40KB
919

ssh_ui

ssh_ui 帮助您轻松地将基于 cursive 的终端用户界面 (TUI) 转换为可以通过 ssh 访问的应用程序。设计用于简化 BBS 系统或基于 ssh 的游戏的创建,ssh_ui 以最小意见的方法打开 TUI 以进行远程连接,而无需您使用 cursive。ssh 服务器实现由 russh 提供。

最简单的基于 ssh_ui 的应用程序的 main 函数看起来像这样

#[tokio::main]
async fn main() {
    let key_pair = KeyPair::generate_rsa(3072, SignatureHash::SHA2_256).unwrap();
    let mut server = AppServer::new_with_port(2222);
    let app = DialogApp {};
    server.run(&[key_pair], Arc::new(app)).await.unwrap();
}

首先,它生成一个新的密钥对(但您应该从磁盘加载几个用于面向用户的安装)。然后,它在端口 2222 上初始化一个新的 AppServer 和一个新的 DialogApp 实例,然后调用 AppServer::run 以在指定的端口上监听传入的连接。接下来,让我们看看是什么让 AppServer 运行起来。

struct DialogApp {}

impl App for DialogApp {
    fn on_load(&mut self) -> Result<(), Box<dyn Error>> {
        Ok(())
    }

    fn new_session(&self) -> Box<dyn AppSession> {
        Box::new(DialogAppSession::new())
    }
}

这里所做的只是当有新的 ssh 连接传入时提供一个新的 DialogAppSessionDialogAppSession 如下实现

struct DialogAppSession {}

impl DialogAppSession {
    pub fn new() -> Self {
        Self {}
    }
}

impl AppSession for DialogAppSession {
    fn on_start(
        &mut self,
        _siv: &mut Cursive,
        _session_handle: SessionHandle,
        _pub_key: PublicKey,
        _force_refresh_sender: Sender<()>,
    ) -> Result<Box<dyn cursive::View>, Box<dyn Error>> {
        println!("on_start");
        Ok(Box::new(
            Dialog::around(TextView::new("Hello over ssh!"))
                .title("ssh_ui")
                .button("Quit", |s| s.quit()),
        ))
    }
}

这里是实际创建并返回给 ssh_uicursive TUI。您可以返回任何 TUI,而 ssh_ui 将负责将其提供给客户端。

贡献

如果您想使用 ssh_ui 但它并不完全符合您的需求,请随时在 GitHub 仓库 上打开一个问题或拉取请求。

依赖项

~21–36MB
~601K SLoC