如何让 ssh 在 WINDOWS 上从标准输入接收密码

Posted

技术标签:

【中文标题】如何让 ssh 在 WINDOWS 上从标准输入接收密码【英文标题】:How to make ssh receive the password from stdin ON WINDOWS 【发布时间】:2017-08-15 05:28:58 【问题描述】:

在阅读了this question 和我的answer 之后,我想在 Windows 上做类似的事情。

我的 Linux 解决方案是这样的:

#!/bin/bash
[[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"

我如何在 Windows 上做类似的事情,我可以从 Windows 命令提示符 或批处理文件中使用类似的东西:

C:> echo password | pass ssh user@host ...

注意事项:

ssh 这里是使用免费版的crwsync 安装的。它使用 Cygwin DLL,但不需要安装 Cygwin。 该解决方案不需要更多依赖项:它可以在典型的 Windows 命令提示符 或批处理文件中运行。

我正在寻找上述问题的答案,即使答案是“无法完成”。我知道我可以使用密钥(及其相对优点)或其他工具,例如 Python/Paramiko、PuTTY plink 等。我知道我可以在 Cygwin 环境中做到这一点。我不想做这些事情......我需要从一个普通的旧 Windows 命令提示符或批处理文件中做这件事,而不会产生额外的依赖关系,因为如果这可能的话,它将减少现有的依赖关系。 p>

这是我目前所拥有的:

@echo off
echo.%1 | findstr /C:"password">nul
if errorlevel 1 (
  set SSH_ASKPASS="%0"
  set DISPLAY="nothing:0"
  %*
) else (
  findstr "^"
)

我们的想法是将其保存为 pass.bat 并像这样使用它:

C:> echo password | pass.bat ssh user@host ...

发生的情况是 SSH 会话已启动,但 ssh 仍以交互方式提示输入密码。我认为,理论上,脚本是可以的,因为下面的作品:

C:> echo mypassword | pass.bat pass.bat "password"
mypassword

就I understand 而言,底层Cygwin DLL 应该可以看到Windows 环境,因此SSH_ASKPASS 的设置应该传播到ssh

我认为问题在于ssh 已连接到终端。根据man ssh如果 ssh 需要密码,如果它是从终端运行的,它将从当前终端读取密码。这就是我在 Linux 示例中使用 setsid 的原因。我认为需要一种从 Windows 终端分离进程的方法,但我是 not sure 有一个(我确实尝试过 start /B)。

所以我被困住了 - 我对脚本窗口的了解不够多,不知道应该做什么。欢迎使用本机 Windows 技术(即批处理或可能是 powershell)并且不需要任何普通 Windows 上不可用的任何解决方案。

我正在开发的跨平台应用程序将使用该解决方案,该应用程序需要使用 SSH 与外部服务进行交互。当前的原型版本是 Python,并且已连接到将 ssh 作为子进程启动。 Linux版本已经使用了上述方法,所以我想要一个不需要返工应用程序的Windows解决方案。

【问题讨论】:

【参考方案1】:

SSH 永远不会从标准输入读取密码。我会试一试sshpass 实用程序,这对于这项任务来说是相当标准的。另一个常见的解决方案是使用expect 脚本(在 Cygwin 上的工作方式与在 Linux 上的工作方式相同)。

【讨论】:

我确实说过我知道这些事情,并且我特别在寻找原生 Windows 解决方案,如果有的话。

以上是关于如何让 ssh 在 WINDOWS 上从标准输入接收密码的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 上从桌面启动的程序的默认标准输入和标准输出是啥?

如何在 Ubuntu 16.04 上从本地计算机打开 ssh 到远程桌面 [不同的 ip]?

如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组

QProcess -> 在 Linux 上从 sftp 读取标准输出

如何在fedora上从eclipse制作一个jar文件?

如何在 Windows 上从 Maven 和 SBT 获得彩色输出?