我有建造 密码在 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 源代码在这个要点或作为源代码和可执行文件这个邮编。
我在尝试解决时发现了这个解决方案另一个问题,这次尝试使用rsync
PuTTY 的plink
程序。我收到一个错误:
Unable to read from standard input: The parameter is incorrect.
这让我发现了cygnative
,但由于原始链接已失效,追踪起来非常困难。
答案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'
怎么运行的:
- -w hide 告诉 mintty 不显示任何 ui 窗口
- Mintty 运行
sh
sh
运行sshpass
和ssh
mintty
不会将 stdout 返回到 windows cmd。因此输出被重定向到临时文件sh
然后使用run outside打印临时文件mintty
很尴尬,但这样一来就需要找到 cygnative 源并进行编译。