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

时间:2018-12-09 18:05:20

标签: windows powershell

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

Host-Read

尽管有this,但它并不能真正回答我的问题,因为它询问的是从powershell调用bash,而我的问题实际上是关于将值从标准输出传递给Window命令以绕过import numpy as np from decimal import * getcontext() n = 20 print('n=',n) def In(n): if n==0: return 1 else: return 2*Decimal(2).ln()**n - n*In(n-1) print('I{}={}'.format(n,float(In(n)))) # check with an existing function of Scipy import scipy.integrate as integrate result = integrate.quad(lambda x: np.log(x)**n, 1, 2) print('I{}={}'.format(n,result)) 提示类型。

2 个答案:

答案 0 :(得分:2)

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

System.Diagnostics.Process中使用.RedirectStandardInput = $true 实例,并在流程开始后使用.StandardInput提供标准输入,可以为您提供更大的灵活性,您的案例唯一需要做的修改就是通过选项-c将命令行作为参数(第二个参数)传递给 program { {1}}(第一个参数)

  • cmd.exe first 参数仅是可执行名称/路径,而不是完整的命令行。

  • 第二个参数接受包含 arguments 的字符串以传递给可执行文件。

  • 由于您正在使用 shell 功能(即将多个命令与管道连接),因此必须使用{{1} }作为可执行文件,并将管道作为自变量传递到[Diagnostics.Process]::Start()的{​​{1}}选项。

    • 您也可以使用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 );它会打开一个新的控制台窗口,显示以下内容:

42

答案 1 :(得分:1)

重定向接收过程的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文件,并在需要时将其导入。您可能还想使用公共密钥身份验证代替密码身份验证。

您已被警告。