Как заставить ssh получать пароль от stdin в WINDOWS

Прочитав этот вопрос и мой ответ, я хотел бы сделать то же самое в 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. Он использует библиотеки DLL Cygwin, но не требует установки 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

Насколько я понимаю, базовые библиотеки DLL Cygwin должны видеть среде Windows, поэтому параметр SSH_ASKPASS должен распространиться на ssh.

Думаю проблема в том, что ssh подключен к терминалу. Согласно man ssh, если ssh требуется парольная фраза, он будет считывать парольную фразу с текущего терминала, если он был запущен из терминала. Вот почему я использую setsid в примере с Linux. Я думаю, что требуется способ отсоединить процесс от терминала в Windows, но я не уверен, что он есть (я пробовал start /B).

Итак, я застрял - я недостаточно знаю о сценариях для окон, чтобы знать, что должно работать. Приветствуется любое решение, в котором используются собственные методы Windows (например, пакетная обработка или, возможно, powershell) и не требуется ничего, чего нет в ванильной Windows.

Решение будет использоваться кросс-платформенным приложением, над которым я работаю и которому необходимо использовать SSH для взаимодействия с внешней службой. Текущая версия прототипа — Python, и она уже настроена для запуска ssh в качестве подпроцесса. Версия для Linux уже использует описанный выше метод, поэтому я хотел бы решение для Windows, не требующее переделки приложения.


person starfry    schedule 22.03.2017    source источник


Ответы (1)


SSH никогда не будет считывать пароль со стандартного ввода. Я бы попробовал sshpass утилиту, вполне стандартную для этой задачи. Другим распространенным решением является использование сценария expect (который должен работать на Cygwin так же, как и на Linux).

person Jakuje    schedule 23.03.2017
comment
Я сказал, что знаю об этих вещах и специально искал родное решение для Windows, если оно есть. - person starfry; 23.03.2017