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

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

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

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

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

2 ответа2

0

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

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

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. Таким образом, здесь также отсутствует перекрестная совместимость, на которую я надеялся. Тем не менее, сейчас это лучше, чем ничего.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .