代码之家  ›  专栏  ›  技术社区  ›  leeand00

将输出导入到由[diagnostics.process]启动的Windows可执行文件:启动?

  •  1
  • leeand00  · 技术社区  · 6 年前

    如何发送一个 echo y 管到 plink 当他们从 [Diagnostics.Process]::Start

    $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 回复  |  直到 6 年前
        1
  •  2
  •   leeand00    6 年前

    Ansgar Wiechers' helpful answer 包含有效的解决方案和合理的安全警告。

    使用 System.Diagnostics.Process 实例 具有 .RedirectStandardInput = $true 及使用 .StandardInput 在流程启动后提供标准输入,这会给您带来更大的灵活性,但在您的情况下 唯一需要的修改是将命令行作为 论点 (第二个参数),通过选项 -c ,为了 程序 cmd.exe (第一参数) .

    • [Diagnostics.Process]::Start() 第一 参数只是 可执行文件名/路径 ,不是完整的命令行。

    • 它是 第二参数 接受包含 争论 传递到可执行文件。

    • 因为你在使用 功能,即连接 倍数 命令与A 管道 你必须使用 命令提示符 作为可执行文件,并将管道作为 论点 命令提示符 /c 选择权。

      • 你可以用 powershell.exe 同样,但在这种简单的情况下,使用 命令提示符 .

    下面是一个简单的例子:

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

    上面演示了stdin输入 42 powershell 这样的过程( $Input );它将打开一个新的控制台窗口,其中显示以下内容:

    stdin input: 42
    Press any key to continue . . .
    
        2
  •  1
  •   Ansgar Wiechers    6 年前

    重定向接收进程的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文件,并在需要时导入它。您还可能希望使用公钥身份验证而不是密码身份验证。

    有人警告过你。