如何在Rust中以子进程方式调用ssh命令?
解决方案
你编写的Rust调用ssh子进程的代码本身逻辑没有问题,运行异常是VSCode内置终端的兼容性缺陷导致,和代码实现无关。
标准实现代码
use std::process::Command; fn main() { let mut child = Command::new("ssh") .arg("user@192.168.0.1") .spawn() .expect("无法启动ssh子进程"); let exit_status = child.wait().expect("等待ssh进程退出失败"); println!("ssh进程最终退出状态:{}", exit_status); }
问题说明
- 上述代码在所有系统原生终端(Windows Terminal、macOS终端、Linux各发行版自带终端等)中均可正常运行,不需要额外调整
- 异常仅触发在VSCode内置终端环境中,该终端对ssh、telnet这类需要申请tty交互的程序,从子进程拉起的场景存在兼容性问题
- 不需要引入第三方ssh库实现该功能,标准库的
std::process::Command完全覆盖需求
VSCode环境测试规避方法
如果需要在VSCode开发阶段测试该功能,可任选以下方案:
- 直接在VSCode外的系统原生终端中运行编译好的二进制文件
- 在VSCode设置中将默认启动终端替换为系统原生终端,重启终端后再运行
- 给ssh添加
-T参数禁用伪终端分配,即可在VSCode内置终端中正常运行:
let mut child = Command::new("ssh") .arg("-T") .arg("user@192.168.0.1") .spawn() .unwrap();
内容的提问来源于stack exchange,提问作者weyh
相关产品推荐
相关产品推荐

