#php #arrays #json #regex #powershell
#php #массивы #json #регулярное выражение #powershell
Вопрос:
Я пытаюсь написать базовый интерпретатор JSON в PowerShell для запланированного внешнего сканера портов, который выводит открытые порты через JSON, но у меня возникают большие проблемы с отображением данных в виде строки, разделенной запятыми. Причина использования строки, разделенной запятыми, заключается в том, что ее можно передать в мой инструмент документации для создания заметок о клиентских сетях.
Мой PHP-код (работает нормально, просто для справки):
<?php
$host = $_SERVER['REMOTE_ADDR'];
$ports = array(
20,
443,
49371
);
echo "[";
foreach ($ports as $port)
{
$connection = @fsockopen($host, $port, $errno, $errstr, 2);
if (is_resource($connection))
{
echo '{' . '"Port":' . $port . ',' . '"status" : "open"' . "},";
fclose($connection);
}
else
{
echo '{' . '"Port":' . $port . ', "status" : "closed"},';
}
} ?> { "result": "done" } ]
Пример вывода HTML при вызове этого PHP-скрипта:
[{"Port":20, "status" : "open"},{"Port":443, "status" : "open"},{"Port":49731, "status" : "closed"}, { "result": "done" } ]
Строка (как переменная), которую я пытаюсь достичь в Powershell:
Open Ports = 20, 443
Мой код Powershell до сих пор:
$Results = invoke-restmethod -uri "https://mywebsite.com/portscan.php"
$OpenPorts = $Results | Where-Object { $_.status -eq "open"} | ConvertFrom-Json
$Message = "Open Ports: $OpenPorts"
Write-host $Message
Ошибка, которую я не могу понять, как решить:
ConvertFrom-Json : Invalid JSON primitive: .
At line:2 char:64
... = $Results | Where-Object { $_.status -eq "open"} | ConvertFrom-Json
~~~~~~~~~~~~~~~~
CategoryInfo : NotSpecified: (:) [ConvertFrom-Json], ArgumentException
FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand
Любая помощь была бы искренне признательна, я не знаком с PowerShell, и это делает мою голову!
Ответ №1:
# Invoke-RestMethod automatically parses the JSON result into
# a [pscustomobject] graph.
# In a manner of speaking, *ConvertFrom-Json is built in*.
$Results = Invoke-RestMethod -Uri "https://mywebsite.com/portscan.php"
# Get the objects representing open ports.
# Note: `Where-Object Status -eq open` is the equivalent of:
# `Where-Object { $_.Status -eq 'open' }`
$OpenPorts = $Results | Where-Object Status -eq open
# Synthesize the output string.
$Message = "Open ports = " ($OpenPorts.Port -join ', ')
# Output (echo) it.
# Output that isn't redirected or captured is *implicitly* echoed in PowerShell.
$Message