テキストファイルにipsのリストがあります。スクリプトは IP のリストを読み取り、各 IP への接続を試みます。この部分は機能しています。
スクリプトがユーザーにアクセスできない IP を検出すると、いくつかのメッセージが返されます。「アクセスが拒否されました」という文字列をキャプチャして、ユーザーにアクセスできない IP のリストを作成したいと考えています。
PS X:\PATH\USER> .\script.ps1
XXX.XXX.XXX.XXX
Access denied
Access denied
Access denied
Access denied
Access denied
FATAL ERROR: Server sent disconnect message
type 2 (protocol error):
"Too many authentication failures for XXXX"
Using username "XXXX".
Access denied
ファイル (ips.txt) の内容は次のとおりです。
xxx.xxx.xxx.xx1
xxx.xxx.xxx.xx2
xxx.xxx.xxx.xx3
xxx.xxx.xxx.xx4
.
.
.
xxx.xxx.xxx.xxn
script.ps1
$ipsarray=(get-content ips.txt)
$size=(get-content ips.txt).Length
Function Invoke-SSHCommands {
Param($Hostname,$Username,$Password, $CommandArray, $PlinkAndPath, $ConnectOnceToAcceptHostKey = $true)
$Target = $Username + '@' + $Hostname
$plinkoptions = "-ssh $Target -pw $Password"
$CommandArray += "exit"
$remoteCommand = ""
if($ConnectOnceToAcceptHostKey)
{
$PlinkCommand = [string]::Format('echo y | & "{0}" {1} exit', $PlinkAndPath, $plinkoptions )
$msg = Invoke-Expression $PlinkCommand
}
$PlinkCommand = [string]::Format('& "{0}" {1} "{2}"', $PlinkAndPath, $plinkoptions , $remoteCommand)
$msg = Invoke-Expression $PlinkCommand
}
$PlinkAndPath = "XXXX\plink.exe"
$Username = "XXX"
$Password = "XXX"
for ($i=0; $i -lt $size; $i++) {
$Hostname=$ipsarray[$i]
Write-Host $Hostname
Invoke-SSHCommands -User $Username -Hostname $Hostname -Password $Password -PlinkAndPath $PlinkAndPath -CommandArray $Commands
}
こんにちはデビッド。の繰り返し構造内のコードを変更しました
for ($i=0; $i -lt $tamanho; $i++) {
$Hostname=$vetor[$i]
Write-Host $Hostname
$response = Invoke-SSHCommands -User $Username -Hostname $Hostname -Password $Password -PlinkAndPath $PlinkAndPath -CommandArray $Commands
if ($null -ieq $response) {
write-host "EMPTY"
}
else {
write-host $response
}
}
この行はオペレーティング システムと対話しています。返されるものをキャプチャする方法がわかりません。応答は端末に送信されます。つまり、スクリプトには返されません。
$response = Invoke-SSHCommands -User $Username -Hostname $Hostname -Password $Password -PlinkAndPath $PlinkAndPath -CommandArray $Commands
次の条件は常に EMPTY です
if ($null -ieq $response) {
write-host "EMPTY"
}
else {
write-host $response
}
変数の型を確認するために if ステートメントを変更しました
if ($null -ieq $response) {
$response.GetType().Name
write-host "EMPTY"
}
変数 $response の結果は常に null です
You can not call a method on a null expression.
X:\PATH\USER\script.ps1:xx caractere:xx
+ $response.GetType <<<< ().Name
+ CategoryInfo : InvalidOperation: (GetType:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
ここで、変数 $msg によって返される結果をテストすることにし、コード行を次のように変更しました。
$msg = Invoke-Expression $PlinkCommand
return $msg
変数 $msg の戻り値をテストするように変更されたループ (for) の例。
for ($i=0; $i -lt $tamanho; $i++) {
$Hostname=$vetor[$i]
Write-Host $Hostname
$response = Invoke-SSHCommands -User $Username -Hostname $Hostname -Password $Password -PlinkAndPath $PlinkAndPath -CommandArray $Commands
if ($null -eq $response) {
write-host "NULL"
}
else {
write-host $response
}
}
関数呼び出し後に if に表示される例。「アクセスが拒否されました」を返さない
user@xxx.xxx.xxx.xxx's password: user@xxx.xxx.xxx.xxx's password: user@xxx.xxx.xxx.xxx's password: user@xxx.xxx.xxx.xxx's password: root@xxx.xxx.xxx.xxx's password: