在那里阅读了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。 我正在寻找上述答案,即使答案是"也无法完成"。我知道我可以使用密钥(及其相对优点),或其他工具,如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解决方案。
答案 0 :(得分:0)
SSH永远不会从stdin读取密码。我会给出一个sshpass
实用程序,这是此任务的标准。另一个常见的解决方案是使用expect
脚本(在Cygwin上的工作方式与在Linux上相同)。