Rust在Windows下创建带共享密钥的分离进程实现方案问询
我开发了一款服务端程序,启动监听时会生成用于加密和认证的密钥,设计预期为通过SSH启动该服务时,程序通过标准输出stdout下发密钥,供远程主机捕获使用,对应执行命令如下:
# 绑定可用端口、生成密钥,通过标准输出输出相关信息 distant server listen # 输出格式为 {端口} {密钥} # 示例: 1234 abcdef123456789
该设计参考了mosh的实现逻辑:mosh通过SSH登录远程机器后,会派生mosh服务端进程(通过fork操作脱离SSH会话),并向终端打印格式为MOSH CONNECT {port} {key}的特定连接信息,示例输出如下:
$ mosh-server MOSH CONNECT 60001 iurF5lS6EVGE/ebYS4j6dQ mosh-server (mosh 1.3.2) [build mosh-1.3.2] Copyright 2012 Keith Winstein <mosh-devel@mit.edu> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [mosh-server detached, pid = 16165]
Unix平台的进程守护实现
在类Unix系统中,可借助fork库提供的fork逻辑创建新进程,当父进程或sshd绑定的关联shell终止时,新进程不会同步退出;通过fork操作还可实现向控制台输出信息的进程与守护化进程之间的生成密钥共享。
Windows平台的进程守护实现疑问
在Windows平台上,我暂未找到可行方案,实现生成密钥与已创建子进程的共享,或是将子进程生成的密钥回传至原控制台。我曾尝试使用进程创建标志CREATE_NEW_PROCESS_GROUP和DETACHED_PROCESS,派生shell退出后不会终止的后台子进程,但此时子进程无法通过stdin(标准输入)接收密钥,也无法通过stdout(标准输出)上报密钥。
更新说明: 即便使用了上述分离进程与新建进程组标志,在Windows运行的OpenSSH服务端关联shell中创建的这类进程,依旧会在SSH会话关闭时终止。想咨询除了开发Windows服务之外,是否有其他方法,可以创建在SSH会话中启动、会话关闭后仍能持续运行的后台进程?
Windows端测试代码
use std::{ os::windows::process::CommandExt, process::{Command, Stdio}, }; const DETACHED_PROCESS: u32 = 0x00000008; const CREATE_NEW_PROCESS_GROUP: u32 = 0x00000200; const CREATE_NO_WINDOW: u32 = 0x08000000; // 生成不绑定当前控制台、不关联父进程的子进程,确保父进程甚至关联shell退出后 // 子进程仍能持续运行 // // 使用DETACHED_PROCESS标志时,继承stdin/stdout/stderr的配置不生效。是否存在安全的 // 进程间通信方式,可以给子进程传入密钥,或是从子进程接收生成的密钥? // // 如果不搭配DETACHED_PROCESS,仅使用CREATE_NEW_PROCESS_GROUP能不能实现守护化效果? // 如果可以,能否通过这个标志保持和现有控制台的连接? let child = Command::new(program) .creation_flags(DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW) .args(args) .stdin(Stdio::inherit()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .spawn()?;
内容的提问来源于stack exchange,提问作者Senkwich
相关产品推荐
相关产品推荐

