从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))
提示类型。
答案 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文件,并在需要时将其导入。您可能还想使用公共密钥身份验证代替密码身份验证。
您已被警告。