首页 文章

将输出管道输出到由[Diagnostics.Process] :: Start启动的Windows可执行文件?

提问于
浏览
1

[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 回答

  • 1

    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 就足够了 - 而且速度更快 .

    这是一个简化的例子:

    $meProcessID = ([Diagnostics.Process]::Start(
      # Program to launch
      'cmd',
      # Arguments to pass
      '/c echo 42 | powershell -nop -c "''stdin input: '' + $Input" & pause'
    ).Id
    

    上面演示了 powershell 进程看到stdin输入 42$Input );它会打开一个新的控制台窗口,显示以下内容:

    stdin input: 42
    Press any key to continue . . .
    
  • 2

    重定向接收进程的STDIN . 像这样的东西:

    $username = $uPwd.GetNetworkCredential().Username
    $password = $uPwd.GetNetworkCredential().Password
    
    $p = New-Object Diagnostics.Process
    $p.StartInfo.FileName = 'plink.exe'
    $p.StartInfo.Arguments = $hostName, '-l', $username, '-pw', $password,
        "`"echo '${password}' | sudo -S '/home/someuser/somescript.sh'\`""
    $p.StartInfo.RedirectStandardInput = $true
    $p.StartInfo.UseShellExecute = $false
    $p.Start()
    
    $p.StandardInput.WriteLine('y')
    
    $p.Id  # get the PID
    

    话虽如此,我假设 echo y 用于接受主机密钥 . 这样做有效地禁用了一个重要的SSH安全机制来对抗中间人攻击,所以我强烈建议不要这样做 . 在进行自动连接之前,最好先验证远程主机的SSH主机密钥并将其导入注册表 . 您可以使用哈希准备一个.reg文件,并在需要的地方导入 . 您可能还希望使用公钥身份验证而不是密码身份验证 .

    你被警告了 .

相关问题