我在远程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将文本'using username“plakat”'写入stderr。这可能会导致错误消息。我可以以某种方式压制这个吗? (管道stderr到stdout或其他东西。)
问题2:此过程退出我应输入密码的位置。我也可以使用其他命令重现它,如
[mobius]: PS C:\Windows\system32> cmd /c date
它不允许我输入日期。如果我在本地PowerShell中运行它们,则这两个命令都有效。在这种情况下,问题1或2都没有出现。
答案 0 :(得分:1)
远程PowerShell会话不支持交互式本机Windows控制台命令。我知道这听起来很愚蠢,但目前情况就是这样(从PowerShell v4.0开始)。
大多数命令行实用程序都支持某种形式的自动化,无论是管道还是将值作为参数传递,请仔细查看您正在使用的工具。当然,这是根据具体情况而定。没有简单的方法可以以任何通用的方式拦截远程端的交互式提示。
答案 1 :(得分:1)
您可以使用执行和退出的 Invoke-command cmdlet来回避此问题
Invoke-Command -ComputerName Mobius -ScriptBlock {## your stuff}
并将其与管道结合使用,以便在日期命令
的情况下使用 Invoke-Command -ComputerName Mobius -ScriptBlock {echo "01-02-1999" |cmd /c date}
或plink
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表示没有真正的互动性。