从 [Diagnostics.Process]::Start
启动 echo y
管道时如何将 echo y
管道发送到 plink
$meProcessID = ([Diagnostics.Process]::Start("echo y | plink.exe", "$($hostName) -l $($uPwd.GetNetworkCredential().Username) -pw $($uPwd.GetNetworkCredential().Password) \`"echo '$($uPwd.GetNetworkCredential().Password)' | sudo -S '/home/someuser/somescript.sh'\`"")).Id
虽然有this它没有询问从powershell调用bash而我的确是关于从标准输出传递一个Window命令来绕过 Host-Read
类型的提示 .
2 回答
Ansgar Wiechers' helpful answer包含有效的解决方案和明智的安全警告 .
将
System.Diagnostics.Process
实例与.RedirectStandardInput = $true
一起使用,并在进程启动后使用.StandardInput
提供标准输入,为您提供更大的灵活性,但在您的情况下 the only modification that was needed was to pass your command line as an argument (2nd parameter), via option -c, to program cmd.exe (1st parameter) .[Diagnostics.Process]::Start()
的第一个参数只是可执行文件名/路径,而不是完整的命令行 .这是第二个接受包含要传递给可执行文件的参数的字符串的参数 .
由于您正在使用shell功能,即使用管道连接多个命令,您必须使用
cmd.exe
作为可执行文件,并将管道作为参数传递给cmd.exe
的/c
选项 .您也可以使用
powershell.exe
,但在这个简单的情况下,使用cmd.exe
就足够了 - 而且速度更快 .这是一个简化的例子:
上面演示了
powershell
进程看到stdin输入42
($Input
);它会打开一个新的控制台窗口,显示以下内容:重定向接收进程的STDIN . 像这样的东西:
话虽如此,我假设
echo y
用于接受主机密钥 . 这样做有效地禁用了一个重要的SSH安全机制来对抗中间人攻击,所以我强烈建议不要这样做 . 在进行自动连接之前,最好先验证远程主机的SSH主机密钥并将其导入注册表 . 您可以使用哈希准备一个.reg文件,并在需要的地方导入 . 您可能还希望使用公钥身份验证而不是密码身份验证 .你被警告了 .