Выполнение интерактивной команды в удаленном сеансе 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, нет реальной интерактивности.