我有一个PowerShell脚本,它定期调用plink.exe
。通常情况下,关于键盘交互提示的两行输出只是令人讨厌。
但是,当使用Start-Job
运行时,只要我调用Receive-Job
,它们就会以错误文本的形式输出。
有什么办法可以抑制这些吗?我宁愿不把所有的错误都抑制住。
我的测试代码:
$test_scriptblock = [scriptblock]::Create(@"
param(
`$argumentlist
)
`$pw = `$argumentlist.pw
& 'C:Program FilesPuttyPlink.exe' -ssh `"admin@*.*.*.*" -pw `$pw -batch whoami
"@)
$testParm = @{
pw = Read-Host "password"
}
$testjob = Start-Job -scriptblock $test_scriptblock -Argumentlist $testParm
$i = 0
do {
$i++
sleep 2
$results = Receive-Job $testjob
ForEach ($result in $results) {
Write-Host $result
}
if ($testjob.State -eq "Completed") {
$jobcompleted = $true
}
If ($i -gt 10) {
Stop-job $testjob
$jobcompleted = $true
}
} until ($jobcompleted)
只需将stderr重定向到plink或pscp命令行,添加到一个额外的伪文件中,如
pscp ... 2> stderr.txt
需要注意的是,它可能会吞下其他有效的错误消息,风险自负:(
在Plink中无法抑制键盘交互提示。
我建议您使用本机.NET SSH实现,如SSH.NET,而不是驱动外部控制台应用程序。
Ir有点麻烦,但最终我设法抑制了"键盘交互式";消息是这样的:
[String] $Plink = 'C:Program FilesPuTTYplink.exe'
[Array] $PlinkPar = @("-ssh", "-l", $usr, "-pw", $pwd, $hst) # Set plink parameters
[Boolean] $PlinkOK = $True
Write-Host "Accept possibly unknown host key"
"y" | & $Plink $PlinkPar "exit" 2>&1 | Tee-Object -Variable PlinkOut | Out-Null
$PlinkOut | Foreach-Object {
$PlinkStr = $_.ToString()
If ($_ -is [System.Management.Automation.ErrorRecord]) {
If (! $PlinkStr.Contains("eyboard-interactive")) {
Write-Host "Error: $PlinkStr"
$PlinkOK = $False
}
} else {
Write-Host "$PlinkStr"
}
}
If (! $PlinkOK) { exit }
$PlinkPar += "-batch
输出是这样的:
>powershell .InstCR.ps1 -usr myuser -pwd mypassword -hst doesnotexist
Accept possibly unknown host key
Error: Unable to open connection:
Error: Host does not exist
这个plink调用只是为了接受一个可能未知的主机密钥(没有"-batch"和管道"y"来回答提示(。然后"-批次";添加到Plink参数中,以便在所有后续的Plink调用中使用。