【发布时间】:2011-03-08 23:05:26
【问题描述】:
我正在尝试获取一个脚本,该脚本可在本机 Windows shell 和 cygwin shell(通过 ssh)中运行,提示输入并读取用户输入的密码。到目前为止,我已经尝试了以下方法:
- 使用 Term::ReadKey 并将 ReadMode 设置为 'noecho'
- 结果:返回错误
GetConsoleMode failed并退出
- 结果:返回错误
- 使用 Term::ReadPassword::Win32
- 结果:挂起并且从不提供提示或读取输入
- 使用 IO::Prompt
- 结果:返回错误
Cannot write to terminal并退出
- 结果:返回错误
- 使用 Term::InKey
- 结果:返回错误
Not implemented on MSWin32: The handle is invalid并退出
- 结果:返回错误
所有这些都在本机 Windows shell(命令提示符或电源 shell)中工作,但是当我在与服务器的 ssh 会话中时,它们都不起作用。
真的,这是我最感兴趣的,让它在远程 ssh 会话中工作。
我通过安装在 Windows 服务器 (2003 R2) 上的 cygwin 获取 ssh。我使用的是草莓 perl 而不是 cygwin perl(cygwin perl 破坏了我需要在 Windows 中本地运行的其他 perl 脚本,而不是通过 ssh)。
我的最佳猜测是 cygwin+Windows 与草莓 perl 搞混了,以至于它无法判断它所处的环境类型。我正在寻找替代 sshd+Windows 解决方案来探索这一点。
这些是我在搜索中能够找到的所有方法。是否还有其他人可以建议其他方法来隐藏用户输入?
【问题讨论】:
-
“它们都不起作用”是什么意思?是用户没有得到提示还是用户的输入没有隐藏?
-
从ssh会话测试,第一种方法返回错误
GetConsoleMode failed并退出,第二种方法挂起并且从不提供提示或读取输入,第三种方法返回错误Cannot write to terminal并退出,第四种方法返回错误Not implemented on MSWin32: The handle is invalid并退出。在本机 Windows shell 中,除了返回相同错误的第三种方法外,它们都可以工作,因此可能我只是没有正确调用它。 -
请注意:当在 cygwin 下编译时,链接库中会附带大量 UNIXish 仿真:例如诸如 cygwin 的 sshd 正在使用的 UNIXish pty 接口之类的东西。不幸的是,您使用的 Perl 尚未使用 cygwin 接口进行编译,并且要与其接口,您需要 cygwin 仿真库。你知道为什么你的脚本不能使用 cygwin 下编译的 Perl 运行吗?
标签: windows perl ssh cygwin hidden