如何让 ssh 从 Windows 上的 stdin 接收密码

sta*_*fry 6 windows cygwin openssh batch-file

阅读完这个问题和我的答案后,我想在 Windows 上做类似的事情。

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

#!/bin/bash
[[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"
Run Code Online (Sandbox Code Playgroud)

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

C:> echo password | pass ssh user@host ...
Run Code Online (Sandbox Code Playgroud)

注意事项:

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

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

这是我到目前为止所拥有的:

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

这个想法是将其另存为,说pass.bat并像这样使用它:

C:> echo password | pass.bat ssh user@host ...
Run Code Online (Sandbox Code Playgroud)

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

C:> echo mypassword | pass.bat pass.bat "password"
mypassword
Run Code Online (Sandbox Code Playgroud)

我了解,底层的 Cygwin DLL 应该能够看到 Windows 环境,因此 的设置SSH_ASKPASS应该传播到ssh.

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

所以我陷入了困境 - 我对脚本窗口了解不够,不知道什么应该有效。任何使用本机 Windows 技术(即批处理或 powershell)并且不需要普通 Windows 上不可用的任何内容的解决方案都将受到欢迎。

该解决方案将由我正在开发的需要使用 SSH 与外部服务交互的跨平台应用程序使用。当前的原型版本是 Python,并且已准备好作为ssh子进程启动。Linux 版本已经使用上述方法,因此我想要一个不需要重新设计应用程序的 Windows 解决方案。

Jak*_*uje 0

SSH 永远不会从 stdin 读取密码。我会提供一个射击sshpass实用程序,这对于此任务来说是相当标准的。另一种常见的解决方案是使用expect脚本(它在 Cygwin 上的工作方式应该与在 Linux 上相同)。