Как я могу автоматизировать plink без PATH (Putty Link) в Windows? и получить его вывод?

Я пробовал обе стандартные 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

У меня проблема в том, что если я запускаю plink вручную через cmd, я получаю вывод, который мне нужно прочитать и, возможно, отобразить пользователю. Передача последней строки в Out-File ничего мне не дает, и если я попытаюсь вызвать cmd, чтобы затем перенаправить в txt-файл, я получаю сообщение об ошибке, потому что в пути для plink есть пробел; и я использую кавычки.

Я также попробовал использовать .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 и ничего.


person user3377627    schedule 26.05.2015    source источник
comment
Вы подключаетесь к серверу Windows, на котором работает Cygwin? Ваша комбинация вызова файла .exe с использованием команд *nix (ls) необычна. Работает ли последовательность команд, если вы набираете ее вручную в терминале SSH (PuTTY)?   -  person Martin Prikryl    schedule 26.05.2015


Ответы (2)


Делать то, что вы просите, должно быть так же просто, как:

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

Если это не сработает (поскольку вы утверждаете, что пробовали что-то подобное), сообщите нам более подробную информацию о проблеме.

person Martin Prikryl    schedule 26.05.2015
comment
Это сработало правильно. Мне все еще нужно вызывать его с помощью &, но, похоже, он выводит информацию правильно. - person user3377627; 30.05.2015

Вы не создали объект 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
person beehaus    schedule 26.05.2015
comment
Метод WriteLine уже добавляет к строке новую строку. Добавление вручную не требуется. - person Ansgar Wiechers; 26.05.2015