winpty:Windows下类Unix pty接口实现,支持控制台程序与终端交互

A Windows software package providing an interface similar to a Unix pty-master for communicating with Windows console programs.

分支5Tags5
文件最后提交记录最后更新时间
7 年前
7 年前
7 年前
9 年前
7 年前
10 年前
9 年前
7 年前
8 年前
8 年前
7 年前
9 年前
9 年前

winpty

构建状态

winpty 是一款 Windows 软件包,它提供了一个类似于 Unix pty-master 的接口,用于与 Windows 控制台程序进行通信。该软件包包含一个库(libwinpty)以及一个供 Cygwin 和 MSYS 使用的工具,用于在 Cygwin/MSYS pty 中运行 Windows 控制台程序。

该软件的工作原理是:启动 winpty-agent.exe 进程,并为其创建一个新的隐藏控制台窗口,该窗口在控制台 API 和终端输入/输出转义码之间架起桥梁。它会轮询隐藏控制台的屏幕缓冲区以检测变化,并生成相应的输出流。

Unix 适配器允许在 mintty 或 Cygwin 的 sshd 下运行 Windows 控制台程序(例如 CMD、PowerShell、IronPython 等),并确保输入(如箭头键和功能键)和输出(如行缓冲)能够正常工作。该库对于编写非 Cygwin 的 SSH 服务器也可能很有用。

支持的 Windows 版本

winpty 可在 Windows XP 到 Windows 10(包括服务器版本)上运行。它可以编译为 32 位或 64 位二进制文件。

Cygwin/MSYS 适配器(winpty.exe

前提条件

构建 winpty 需要以下工具:

  • Cygwin 或 MSYS 安装环境
  • GNU make
  • 能够编译 C++11 代码的 MinGW g++ 工具链,用于构建 winpty.dllwinpty-agent.exe
  • 面向 Cygwin 或 MSYS 的 g++ 工具链,用于构建 winpty.exe

Winpty 需要两个 g++ 工具链,因为它分为两个部分。winpty.dllwinpty-agent.exe 二进制文件与原生 Windows 命令提示符窗口交互,因此它们使用原生 MinGW 工具链编译。winpty.exe 二进制文件与 MSYS/Cygwin 终端交互,因此它使用 MSYS/Cygwin 工具链编译。

MinGW 似乎分为两个发行版——MinGW(创建 32 位二进制文件)和 MinGW-w64(创建 32 位和 64 位二进制文件)。通常,这两个发行版中的任何一个都是可以接受的。

Cygwin 软件包

Cygwin 的默认 g++ 编译器面向 Cygwin 本身,但 Cygwin 也提供了 MinGW-w64 编译器的软件包。在撰写本文时,所需的软件包如下:

  • mingw64-i686-gcc-g++mingw64-x86_64-gcc-g++。请为您的 CPU 架构选择合适的编译器。
  • gcc-g++
  • make

在撰写本文时(2016-01-23),只有 MinGW-w64 编译器是可接受的。MinGW 编译器(例如来自 mingw-gcc-g++ 软件包)已不再维护,且存在较多缺陷。

MSYS 软件包

对于原始 MSYS,请使用 mingw-get 工具(MinGW 安装管理器),并至少选择以下组件:

  • mingw-developer-toolkit
  • mingw32-base
  • mingw32-gcc-g++
  • msys-base
  • msys-system-builder

运行 ./configure 时,请确保 mingw32-g++ 在您的 PATH 中。它通常位于 C:\MinGW\bin 目录下。

MSYS2 软件包

对于 MSYS2,请使用 pacman 并至少安装以下软件包:

  • msys/gcc
  • mingw32/mingw-w64-i686-gccmingw64/mingw-w64-x86_64-gcc。请为您的 CPU 架构选择合适的编译器。
  • make

MSYS2 提供了三个用于启动 MSYS2 的开始菜单快捷方式:

  • MinGW-w64 Win32 Shell
  • MinGW-w64 Win64 Shell
  • MSYS2 Shell

要构建 winpty,请使用与 MSYS2 架构匹配的 MinGW-w64 {Win32, Win64} 快捷方式。这些快捷方式会将 {mingw32, mingw64}/mingw-w64-{i686, x86_64}-gcc 软件包中的 g++ 编译器添加到 PATH 中。

或者,您也可以不安装 mingw32/mingw-w64-i686-gccmingw64/mingw-w64-x86_64-gcc,而是安装 mingw-w64-cross-gccmingw-w64-cross-crt-git 软件包。这些软件包会将交叉编译器安装到 /opt/bin 目录,这样三个快捷方式中的任何一个都可以使用。

构建 Unix 适配器

在项目目录中,运行 ./configure,然后运行 make,最后运行 make install。 默认情况下,winpty 会安装到 /usr/local。在执行 make install 时传递 PREFIX=<path> 可以覆盖此默认路径。

使用 Unix 适配器

要在 mintty 或 Cygwin sshd 中运行 Windows 控制台程序,请在命令行前加上 winpty

$ winpty powershell Windows PowerShell Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\rprichard\proj\winpty> 10 + 20
30
PS C:\rprichard\proj\winpty> exit

嵌入 winpty / MSVC 编译

有关 winpty.dll 导出函数的原型,请参见 src/include/winpty.h

只有 winpty.exe 二进制文件使用 Cygwin;其他所有二进制文件都可在不依赖 Cygwin 的情况下运行,并且可以使用 MinGW 或 MSVC 进行编译。要使用 MSVC 编译,请下载 gyp 并在 src 子目录中运行 gyp -I configurations.gypi。这将生成 winpty.sln 及相关项目文件。有关处理 MSVC 版本和不同架构的说明,请参见 src/winpty.gypsrc/configurations.gypi 文件。

当前,使用 MSVC 编译 winpty 需要 MSVC 2013 或更高版本。

调试 winpty

winpty 附带了一个用于收集带时间戳的调试输出的工具。使用方法如下:

  1. 在运行 winpty 的同一台计算机上运行 winpty-debugserver.exe
  2. winpty.exe 进程和/或使用 libwinpty.dll 的进程,将 WINPTY_DEBUG 环境变量设置为 trace

winpty 还识别 WINPTY_SHOW_CONSOLE 环境变量。将其设置为 1 可防止 winpty 隐藏控制台窗口。

版权

本项目根据 MIT 许可证分发(请参见项目根目录下的 LICENSE 文件)。

通过为本项目提交拉取请求,您同意将您的贡献根据 MIT 许可证授权给本项目。

项目介绍

A Windows software package providing an interface similar to a Unix pty-master for communicating with Windows console programs.

定制我的领域