如何使ssh从stdin ON WINDOWS接收密码

时间:2017-03-22 21:19:38

标签: windows batch-file cygwin openssh

在那里阅读了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命令提示符或批处理文件中执行此操作而不会产生其他依赖项,因为如果可能的话,它将减少现有的依赖项。

这是我到目前为止所做的:

@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已连接到终端。根据{{​​1}},如果ssh需要密码短语,它将从当前终端读取密码短语,如果它是从终端运行的。这就是我使用man ssh的原因。 Linux的例子。我认为需要一种在Windows中从终端分离进程的方法,但我not sure有一个(我确实尝试setsid)。

所以我被卡住了 - 我对脚本窗口知之甚少,不知道应该有什么用。任何使用本机Windows技术的解决方案(即批量或可能是PowerShell)并且不需要在vanilla Windows上不可用的任何东西都是受欢迎的。

该解决方案将由我正在使用的跨平台应用程序使用,该应用程序需要使用SSH与外部服务进行交互。当前的原型版本是Python,并且可以作为子进程启动start /B。 Linux版本已经使用了上述方法,所以我想要一个不需要重新处理应用程序的Windows解决方案。

1 个答案:

答案 0 :(得分:0)

SSH永远不会从stdin读取密码。我会给出一个sshpass实用程序,这是此任务的标准。另一个常见的解决方案是使用expect脚本(在Cygwin上的工作方式与在Linux上相同)。