如何在 windows 上自动化 none-PATH plink (Putty Link)?并得到它的输出?

How can I automate none-PATH plink (Putty Link) on windows? and get its output?

我一直在尝试两种标准 PS1 使用我读到的关于使用的内容:

ECHO y | plink .....

但我遇到的问题是 plink 被保存在网络驱动器上。我可以使用以下方式调用它:

$plink = "P:\path\plink.exe"
echo y | &$plink -ssh -l user-pw password $addrss exit
&$plink -ssh -l user -pw password -m "P:\path\SCOTDiagScript.txt" $addrss

我遇到的问题是,如果我 运行 通过 cmd 手动 plink,我会得到输出,我需要阅读并可能向用户显示。将最后一行通过管道传输到 Out-File 不会给我任何结果,如果我尝试调用 cmd 然后重定向到 txt 文件,我会收到错误消息,因为 plink 的路径中有一个 space;我正在使用引号。

我也尝试过使用 .NET,但是执行 .StandardOutput.ReadToEnd() 会导致它挂起;也许僵局?即使我把它放在退出之前很好,并且在任何类型的退出发生之前我让它睡了一会儿:

$ps = New-Object -TypeName System.Diagnostics.Process
$ps.StartInfo.UseShellExecute = $false
$ps.StartInfo.RedirectStandardInput = $true
$ps.StartInfo.RedirectStandardOutput = $true;
$ps.StartInfo.FileName = "P:\path\plink.exe"
$ps.StartInfo.Arguments = "-ssh -l user -pw password $addrss"

[void]$ps.Start() 

Start-Sleep -m 500
$ps.StandardInput.Write("cd c:/scot/bin`r")
Start-Sleep -m 500
$ps.StandardInput.Write("GetDiagFiles.exe`r")
Start-Sleep -m 500
$ps.StandardInput.Write("cd c:/temp`r")
Start-Sleep -m 500
$ps.StandardInput.Write("ls *.zip`r")
Start-Sleep -m 500
$ps.StandardInput.Write("cd c:/scot/monitor`r")
$Out = $ps.StandardOutput.ReadToEnd();
Start-Sleep -s 10
$ps.StandardInput.Write("exit`r")

$PlinkStreamWriter.Close();
if (!$ps.HasExited) { $ps.Kill() }
$Out

我确定我做错了什么,但我已经搜索了 MSDN 上的所有内容,但什么也没有。

按照您的要求做应该很简单:

plink -ssh -l user -pw password -m script.txt > output.log

其中 script.txt 包含您的命令:

cd c:/scot/bin
GetDiagFiles.exe
cd c:/temp
ls *.zip
cd c:/scot/monitor
exit

如果这不起作用(因为您声称您已经尝试过类似的方法),请向我们提供有关该问题的更多详细信息。

您尚未创建 System.Diagnostics.ProcessStartInfo 对象以馈入 System.Diagnostics.Process 对象。

您需要将 `n 放在命令的末尾而不是 `r,或者您可以在使用 .WriteLine 方法时将它们完全删除

我使用一些 cmd.exe 测试了下面的代码并进行了您需要的更改,它应该适用于 plink.exe

$ProcessStartInfo = New-Object System.Diagnostics.ProcessStartInfo
$ProcessStartInfo.UseShellExecute = $false
$ProcessStartInfo.RedirectStandardError = $true
$ProcessStartInfo.RedirectStandardInput = $true
$ProcessStartInfo.RedirectStandardOutput = $true
$ProcessStartInfo.FileName = "P:\path\plink.exe"
$ProcessStartInfo.Arguments = "-ssh -l user -pw password $addrss"

$Process = New-Object System.Diagnostics.Process
$Process.StartInfo = $ProcessStartInfo
$Process.Start() | Out-Null

$Process.StandardInput.WriteLine("cd c:/scot/bin")
$Process.StandardInput.WriteLine("GetDiagFiles.exe")
$Process.StandardInput.WriteLine("cd c:/temp")
$Process.StandardInput.WriteLine("ls *.zip")
$Process.StandardInput.WriteLine("cd c:/scot/monitor")
$Process.StandardInput.WriteLine("exit")

$Process.WaitForExit()

$stdoutput = $Process.StandardOutput.ReadToEnd()
$erroutput = $Process.StandardError.ReadToEnd()

Write-Host "Standard Output: $stdoutput"
Write-Host "Error Output : $erroutput"
Write-Host "exit code: " + $Process.ExitCode