Собственные команды Windows для мониторинга удаленного порта на доступность сервиса

0

Подобный вопрос: Как определить, запущена ли служба удаленного рабочего стола и доступна ли она?

Я искал ответы на проблему "Как мне проверить связь с конкретным портом?" и нашел несколько решений. Еще до поиска я хорошо знал, что «пинг» даже удаленно не является подходящим инструментом для работы, но это самый близкий инструмент с точки зрения функциональности к тому, что я ищу.

Большинство решений проблемы «ping a port» основаны на nmap или других не собственных инструментах, и, как правило, они написаны так, что они полезны только для одноразовой проверки. То, что я хочу сделать, - это иметь возможность непрерывно контролировать порт на удаленном хосте, чтобы я мог получать уведомления о доступности службы на этом порту. Как и в случае с приведенным выше вопросом, наиболее распространенный вариант использования, который у меня есть для этого, - это проверка компьютера на наличие RDP после перезагрузки (один только пинг не является надежным индикатором того, завершена ли загрузка системы и запущены ли все службы).

Ключевое отличие здесь в том, что я собираюсь сделать это с помощью инструментов, которые являются родными для Windows. Я никогда не знаю, когда и где будет, что я захочу контролировать удаленную систему на предмет доступности услуг, и у меня не всегда под рукой есть мои портативные инструменты, когда это происходит, поэтому было бы идеально, если бы простой однострочник с использованием встроенных утилит CMD или PowerShell, которые могут сделать эту работу.

У меня есть некоторые системы с Windows 8 или Server 2012 и PowerShell 4.0, но решения, обратно совместимые с Windows 7 и Server 2008 с PowerShell 2.0, были бы идеальными. (Примечание: версии PowerShell приведены только для справки - подойдет любая команда или краткий сценарий, который будет работать при новой установке указанных версий Windows без необходимости в дополнительном программном обеспечении.)

Iszi
источник

Ответы:

0

Если вы собираетесь выполнять проверку в интерактивном режиме, вы можете использовать клиент TELNET, введя «порт хоста telnet», например «telnet 10.23.43.12 80», чтобы получить доступ к порту HTTP.

Обратите внимание, что клиент telnet не устанавливается по умолчанию с Windows 7 / Windows 2008, поэтому вам нужно активировать инструмент в панели управления -> Установка и удаление программного обеспечения -> Компоненты Windows.

user3767013
источник
Это подпадает под то, что я назвал инструментами, которые полезны только для одноразовой проверки. Я ищу решение «забей и забудь» - то, что будет работать постоянно и либо сообщать мне о состоянии порта на регулярной основе, либо просто сообщать мне, когда он наконец вернется.
Иззи
0

В Windows 8 вы можете использовать, Test-NetConnectionчтобы получить функциональность, аналогичную классической pingи tracertинструментам, а также проверить состояние порта удаленной системы. К сожалению, варианты для Test-NetConnectionотносительно ограничены по сравнению с инструментами, которые он заменяет. Таким образом, одно это не будет хорошо служить для непрерывного монитора. К счастью, PowerShell очень хорошо подходит для сценариев. Вот одна строка (технически, несколько строк сведены в одну), которая будет постоянно проверять доступность порта и выводить результаты с метками времени на консоль.

cls;1..8|%{""};for(){$x=tnc 192.168.0.1 -Po 80;"$(Get-Date) $($x.TcpTestSucceeded)"}

Вот скриншот скрипта в действии. Здесь вы можете увидеть, почему я запустил скрипт, cls;1..8|%{""};хотя это технически не нужно. Кроме того, вы можете видеть, что Test-NetConnectionкаждый раз для запуска требуется около 9-10 секунд, даже если вы подключены к локальной сети.

введите описание изображения здесь

Вот прокомментированная, многострочная версия скрипта. Это тот же код, только разложенный с включенным пошаговым руководством.

# CLS is a built-in alias for Clear-Host.
# This clears any pre-existing output from the console so we can start ours from the top.

cls;

# This takes the integers from 1 through 8 and pipes them to a ForEach-Object loop.
# (The percent symbol, "%", is a built-in alias for ForEach-Object.)
# Putting just a pair of double-quotes in the script block outputs a single blank line.
# Effectively, this line of script just outputs 8 blank lines.
# While Test-NetConnection runs, it puts a status display on the top 8 lines of the console.
# So, we're using this to make our output start below that level in order to be visible.

1..8|%{""};

# This begins an infinite for loop. It will run until aborted by the user.
# (e.g.: With CTRL+C)
# Note: Due to the way Test-NetConnection operates, the abort may take a few seconds to process.

for(){

    # TNC is a built-in alias for Test-NetConnection.
    # -Po is a shorthand for the -Port parameter name.
    # PowerShell allows shortening of parameter names down to as few characters are needed to uniquely identify the parameter.
    # This tests for connectivity to port 80 at 192.168.0.1 and puts the results in $x.

    $x=tnc 192.168.0.1 -Po 80;

    # The last step here is to output a timestamp, and the results.
    # Double-quotes allow for per-processing certain elements before including them in an output string.
    # Encapsulating script blocks with $(), within the double-quotes, lets us put their results directly in the output string.
    # So, the first part gets the date and time for the start of the output.
    # Then, with a space to separate it, the TcpTestSucceeded property of $x is retrieved and put at the end.

    "$(Get-Date) $($x.TcpTestSucceeded)"
    }

Это не так чисто и просто, как хотелось бы, но это делает работу. Я определенно не ожидаю, что запомню его в ближайшее время, но как только вы поймете команды и основы PowerShell, которые заставляют его работать, его сравнительно легко восстановить на лету.

Для чего-то более простого, который просто продолжает проверять порт и останавливается, чтобы сообщить вам, когда он работает, вы можете использовать это:

while((tnc 192.168.0.1 -Po 80).TcpTestSucceeded -eq $False){};Get-Date

Здесь мы используем цикл while для повторного тестирования порта, пока он не работает. После успешного подключения к порту цикл while завершается, и Get-Date сообщает время. Вы также увидите некоторые предупреждающие сообщения в Test-NetConnectionтечение всего времени работы цикла - это потому, что он использует выходной канал Warning, чтобы сообщить о сбое соединения ping или порта, прежде чем он фактически отправит полные результаты как обычный вывод.

К сожалению, Test-NetConnectionнедоступно в системах, работающих под управлением Windows 8. Поэтому здесь также отсутствует перекрестная совместимость, на которую я надеялся. Тем не менее, сейчас это лучше, чем ничего.

Iszi
источник