将诸如Python等不支持重定向IO的应用,使用ConPTY/WinPTY API代理成可重定向IO的程序
比如:配置pty-proxy的目标应用为python,就可以把pty-proxy当成python直接启动然后重定向IO
重定向IO:CreateProcess创建进程时提供STARTUPINFO指定hStdInput、hStdOutput、hStdError,以此获取控制台输出的方法叫重定向IO。
ConPTY API:虚拟终端API,使用CreatePseudoConsole创建虚拟终端,需要Win10以上的操作系统才可用。详见微软的API文档。
WinPTY API:一个社区维护的项目,Win7及以上皆可用。详见项目主页。
一共有两个文件:
pty-proxy.exe:主程序,可随意重命名
pty-proxy-child.exe:辅助程序,名字不可改,必须和主程序在同一个目录下!
终端内启动pty-proxy.exe即查看详细用法
注意:输出的内容含有VT-100转义序列,又叫ANSI转义序列。需要处理掉这些转义序列才能得到正常的文本。推荐使用后端为WinPTY的版本,因为这个版本的转义序列会显著少于ConPTY后端的版本,使用正则\x1B\[(.*?)[A-Za-z]即可去除大部分转义序列。
先运行一次debug模式的构建:
cargo build --features debug_mode --features conpty构建过后才能运行:
cargo run --features debug_mode --features conpty --bin pty-proxy -- cmd.exe /k echo Hello, World!如果修改了pty-proxy-child,则需要重新运行一次debug模式的构建
如果要开发winpty后端的版本,把--features conpty换成--features winpty即可。
cargo build --features conpty --releasetarget/release下的可执行文件即为构建产物
构建前先去https://github.com/rprichard/winpty下载release,比如winpty-0.4.3-msvc2015.zip。
然后在合适位置创建一个winpty_dev文件夹,并且添加到环境变量PATH中
把release包内的x64/bin/winpty.dll、x64/bin/winpty-agent.exe、x64/lib/winpty.lib复制到winpty_dev文件夹内
最后使用以下命令构建:
cargo build --features winpty --releasetarget/release下的可执行文件即为构建产物,发行时需要把winpty-agent.exe、winpty.dll和构建产物放到同一个文件夹下,否则会无法运行。