Выполнение интерактивной команды в удаленном сеансе Powershell не работает

У меня проблемы с выполнением команд в удаленном сеансе PowerShell, которые требуют взаимодействия с пользователем.

Пример: я вхожу в удаленный сеанс

Enter-PSSession -ComputerName mobius

В этом сеансе я выполняю команду, которая запрашивает пароль:

[mobius]: PS C:\Windows\system32> & 'c:\Program Files (x86)\Putty\plink.exe' merlin -l joe

joe@merlin's password:
c:\Program Files (x86)\Putty\plink.exe : Using username "plakat".
    + CategoryInfo          : NotSpecified: (Using username "plakat".:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Последние две строки отображаются красным цветом. Кажется, есть две проблемы.

Проблема 1: plink.exe записывает текст 'Использование имени пользователя "plakat"' в stderr. Это, вероятно, вызывает сообщение об ошибке. Могу ли я это как-то подавить? (труба stderr в stdout или что-то.)

Проблема 2: Процесс завершается в точке, где я должен ввести пароль. Я также могу воспроизвести это с помощью других команд, таких как

[mobius]: PS C:\Windows\system32> cmd /c date

Это не позволяет мне ввести дату. Обе команды работают, если я запускаю их в локальной оболочке PowerShell. Ни проблема 1, ни 2 не отображаются в этом случае.

2 ответа

Решение

Интерактивные собственные консольные команды Windows не поддерживаются в удаленном сеансе PowerShell. Я знаю, это звучит глупо, но в настоящее время это так (в PowerShell v4.0).

Большинство утилит командной строки поддерживают некоторую форму автоматизации, будь то конвейерная передача или передача значений в качестве аргументов, поэтому более внимательно рассмотрите инструменты, которые вы используете. Конечно, это в каждом конкретном случае. Нет простого способа перехватить интерактивную подсказку на удаленном конце каким-либо универсальным способом.

Вы можете обойти проблему, используя командлет Invoke-command, который выполняется и завершается

Invoke-Command -ComputerName Mobius -ScriptBlock {## your stuff}

и объединить его с конвейером так, в случае команды даты

Invoke-Command -ComputerName Mobius -ScriptBlock {echo "01-02-1999" |cmd /c date}

или за плинк

Invoke-Command -ComputerName Mobius -ScriptBlock {"yourpassword"| &'c:\Program Files (x86)\Putty\plink.exe' merlin -l joe `"bashcommand1 && bashcommand2`" }

или даже проще

Invoke-Command -ComputerName Mobius -ScriptBlock { &'c:\Program Files (x86)\Putty\plink.exe' merlin -l joe -pw yourpass `"bashcommand1 && bashcommand2`" }

но, как сказал @X0n, нет реальной интерактивности.

Другие вопросы по тегам