Cygwin 程序(sshpass)在 Windows 命令提示符中使用时不产生任何输出

Cygwin 程序(sshpass)在 Windows 命令提示符中使用时不产生任何输出

我有建造 密码在 Cygwin 上。它在 Cygwin 终端窗口内完美运行:

sshpass -p password ssh -o StrictHostKeyChecking=no user@host

但是,Windows 命令提示符中的完全相同的命令不会产生任何输出。

我尝试了一个非交互式命令来查看它是否有效,但没有效果:

sshpass -p password ssh -o StrictHostKeyChecking=no user@host ls

两者在 Cygwin 环境中运行良好,但在 Windows 命令提示符下则不行。它们在 Windows 命令提示符下运行良好,但没有输出。我知道这一点,因为我可以从窗口发出命令cmd.exe并查看远程主机上的效果。此外,普通命令ssh(Cygwin 命令)在 Windows 命令提示符下运行良好。

sshpass在 Windows 命令提示符中使用时如何获取输出?

答案1

之所以无法工作,是因为 cygwin 和原生 Win32 程序之间的 stdin/stdout 重定向不兼容,但有一个名为 的包装程序cygnative可以解决这个问题。它允许像这样使用所需的命令行:

C:> cygnative sshpass -p password ssh -o StrictHostKeyChecking=no user@host ls

(这适用于非交互式命令,但不适用于交互式终端会话)

原作者的链接已cygnative.exe失效,但可以作为 C 源代码在这个要点或作为源代码和可执行文件这个邮编


我在尝试解决时发现了这个解决方案另一个问题,这次尝试使用rsyncPuTTY 的plink程序。我收到一个错误:

Unable to read from standard input: The parameter is incorrect.

这让我发现了cygnative,但由于原始链接已失效,追踪起来非常困难。

问题描述这里并给出了解决方案cygnative这里,更新版本 1.2这里

答案2

感谢 starfry 对该问题的解释。

我不想使用 cygnative。互联网上的大部分链接都失效了。该程序无人维护,而且你必须自己编译代码。

Cygwin 下的命令之所以有效,是因为 Cygwin 使用 mintty 作为终端,可以正确处理 IO 重定向。

我使用的解决方法是在非交互模式下调用 mintty。在 Windows 命令提示符下运行以下命令:

C:\Development\temp> mintty.exe -w hide bash -c "sshpass -p a ssh kshar@localhost ls 2>&1 > /tmp/mintty.log" && sh -c 'cat /tmp/mintty.log; rm /tmp/mintty.log'

怎么运行的:

  1. -w hide 告诉 mintty 不显示任何 ui 窗口
  2. Mintty 运行sh
  3. sh运行sshpassssh
  4. mintty不会将 stdout 返回到 windows cmd。因此输出被重定向到临时文件
  5. sh然后使用run outside打印临时文件mintty

很尴尬,但这样一来就需要找到 cygnative 源并进行编译。

相关内容