Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Проверка состояния сети. (http://forum.oszone.net/showthread.php?t=235405)

Dreamer_UFA 26-05-2012 12:11 1922916

Проверка состояния сети.
 
Доброго времени суток уважаемые.
Возможно это баян, но что то ничего не нашел. Вернее все отрывисто.

Необходимо сделать батник который бы анализировал состояние сети по 5 контрольным точкам потом бы выдавал проблемное место.
Батник для запуска пользователем, когда он позвонит в ТП. У нас множество удаленных точек и уже порядком поднадоело "подрываться" из за глупых ошибок пользователя.

Наваял сейчас простенький батни. Пингует точки, если пинг не проходит - пишет недоступность. А мне в идеале вывести в конце теста мессадж бокс с примерным содержанием содержанием:

1. Сервер 1 - Доступен
2. Сервер 2 - Доступен
3. Сервер 3 - НЕ доступен
4. Сервер 4 - НЕ доступен
5. Сервер 5 - Доступен

От этого можем отталкиваться уже и анализировать проблему.

Вот батник который сейчас наваял :)


@echo oFF

ping 192.168.140.1 | find "TTL=" > nul
if errorlevel 1 (
msg * "SERVER IBMD NE DOSTUPEN"
) else (
echo "IBMD NE DOSTUPEN"
)

ping 192.168.1.1 | find "TTL=" > nul
if errorlevel 1 (
msg * "MODEM NE DOSTUPEN"
) else (
echo "MODEM DOSTUPEN"
)

ping 77.94.124.70 | find "TTL=" > nul
if errorlevel 1 (
msg * "PDC FILIALA NE DOSTUPEN"
) else (
echo "PDC FILIALA DOSTUPEN"

exit /b
)


как то так. Поделитесь соображениями пожалуйста кому не лень...

PS Другие темы читал, немного не то. Стороннее ПО не получится - стандарты компании не разрешают ставить. Да и точек очень много.
Нужно просто батник который пользователь нажмет по просьбе СТП и прочитает сообщение выданное ей.

Anonymоus 26-05-2012 13:50 1922946

Dreamer_UFA, добавление новых серверов очень простое, посмотрите, как это сделано в примере. Вашим пользователям останется только нажать Ctrl+C на появившемся месседжбоксе и отправить результат вашей техподдержке.

Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Адреса серверов в формате IP:Описание
:: Название переменной - _PointНомер, где номер идет с приращением в 1
Set _Point1=192.168.50.1:Billing server
Set _Point2=192.168.50.5:VPN server
Set _Point3=192.168.72.11:FTP
Set _Point4=127.0.0.1:Loopback
Set _Point5=209.85.148.113:Google.com

Set i=5
Set MsgString="Status:"
:: Получаем набор адресов
Echo Wait...
For /F "tokens=2 delims==" %%A In ('Set _Point') Do (
        For /F "tokens=1,2 delims=:" %%B In ("%%A") Do (
                Echo Checking "%%B"
:: Проверяем на доступность сервера и стабильный пинг к нему
                For /F %%I In ('Ping -n %i% %%B^|Find /C "TTL="') Do (
                        If %%I==%i% (Set Result=Online) Else (Set Result=Unstable connection)
                        If %%I==0 Set Result=Not responding
                )
:: Составляем строку с данными для MsgBox'а
                Set MsgString=!MsgString! + vbCrLf + "%%C - !Result!"
        )
)
:: Генерируем и запускаем vbs-скрипт, выводящий данные
Echo MsgBox %MsgString%>"%Temp%\statusmsg.vbs"
"%Temp%\statusmsg.vbs"


CyberMuesli 27-05-2012 17:24 1923440

Цитата:

Цитата Anonymоus
Ping -n 2 %%B|Find "TTL=" »

сто раз видел | find "TTL=", но имхо, это какое-то списывание друг у друга.

Во-первых, ping прекрасно сам устанавливает errorlevel и не нужно дополнительно анализировать вывод, как это требуется например для nslookup, которая этот errorlevel не устанавливает. Команда

Ping -n 2 %%B|Find "TTL=">nul&&Set Result=Online

полностью эквивалентна

Ping -n 2 %%B &&Set Result=Online

Во-вторых, цель пинга определить возможные проблемы и лучше искать хотя бы одну потерю, а не хотя бы один успех. И вот уже для этой цели, поскольку при хотя бы одном успехе errorlevel будет ноль, надо писать

ping -n 10 %%B | find "(0%"

что будет означать 100% успех

Anonymоus 27-05-2012 17:42 1923447

Цитата:

Цитата CyberMuesli
сто раз видел | find "TTL=", но имхо, это какое-то списывание друг у друга. »

Если вы не видите в дополнительной проверке смысла, это не значит, что его там нету. Ping некорректно возвращает ErrorLevel в некоторых случаях. На скриншоте - один из них.


Dreamer_UFA 27-05-2012 18:33 1923468

Anonymоus : Большое спасибо. Ваш пример с небольшой доработкой то что надо. На первых порах будем испоользовать это.
А вообще сейчас пишу небольшую утилитку на дельфи которая постоянно мониторит соединения. В случае обрыва - выводит пользователю сообщение. В любое время можно навести курсор мыши на ярлык в трее - будет отчет по всем соединениям. Планы такие пока.

"|FIND TTL=" честно списал. Мне показалось достаточным того что при первых откликах на пинг система считала связь нормальной.

Iska 27-05-2012 19:22 1923494

Цитата:

Цитата Anonymоus
Ping некорректно возвращает ErrorLevel в некоторых случаях. На скриншоте - один из них. »

Поясните скриншот.

Anonymоus 27-05-2012 19:32 1923501

Iska, согласно technet:
Цитата:

Сообщение «Заданная сеть недоступна» означает, что отсутствует маршрут к сети назначения. Необходимо проверить таблицу маршрутизации на маршрутизаторе, адрес которого указан в сообщении «Заданная сеть недоступна». Дополнительные сведения о таблице маршрутизации см. в разделе Общее представление о таблице IP-маршрутизации.
При этом, хотя фактически пинг не прошел - ErrorLevel остается нулевым. Разбор вывода с помощью «Find "TTL="» всегда позволяет определить, прошел ли хоть один пинг, вместо того, чтобы слепо полагаться на возвращаемый ErrorLevel.

Iska 27-05-2012 19:56 1923511

Anonymоus, так, а почему отчего на скриншоте есть сообщение о полученном пакете?

Anonymоus 27-05-2012 20:03 1923517

Вот этого я не скажу, подозреваю, что пакет вернул маршрутизатор, а не указанный узел 192.168.70.1. Но то, что туда от меня пакеты не приходили - это факт.

Iska 27-05-2012 20:32 1923531

А что в ICMP-пакете содержится?

Anonymоus 27-05-2012 20:48 1923538

Iska,
Код:

Протокол          : ICMP
Локальный адрес  : 10.3.3.230
Удалённый адрес  : xx.xx.xx.xxx
Пакеты            : 1  {0 ; 1}
Объём данных      : 60 байт  {0 ; 60}
Общий размер      : 176 байт  {0 ; 176}
Время захвата    : 27.05.2012 19:42:41:078
Время последнего пакета: 27.05.2012 19:42:41:078
Данные:
00000000  45 00 00 3C 15 67 00 00  7F 01 75 C8 0A 03 03 E6  E..<.g.. .u.....
00000010  5C A8 46 01 08 00 34 5C  03 00 16 00 61 62 63 64  \.F...4\ ....abcd
00000020  65 66 67 68 69 6A 6B 6C  6D 6E 6F 70 71 72 73 74  efghijkl mnopqrst
00000030  75 76 77 61 62 63 64 65  66 67 68 69              uvwabcde fghi


CyberMuesli 27-05-2012 23:44 1923665

Цитата:

Цитата Anonymоus
Ping некорректно возвращает ErrorLevel в некоторых случаях. »

Спасибо, Вы правы. Я смог смоделировать эту ситуацию.
  • На вайфайке есть host и guest зона, между ними настроена маршрутизация
  • Компьютер в host зоне, телефон в guest зоне
  • Телефон помещаем в бидон, бидон в кастрюлю, открываем и закрываем крышку кастрюли, пингуем, пинги то есть, то нет
  • При этом сообщения об ошибке могут быть разные: узел недоступен, превышен интервал ожидания запроса
  • При этом errorlevel 0

find "TTL" действительно самый дешевый способ. Но мне он не нравится тем, что если из 10 пингов 1 пройдет, эта команда нам скажет, что всё в порядке, тогда как цель такого мониторинга выявить проблемы.

Набросал вот. Алгоритм следующий: мы просим find не просто найти TTL, а подсчитать количество таких строк. Эту цифру мы можем считать и сравнить с той, которую передавали ранее пингу в параметре -n. Если хотя бы один пинг не прошел - операция считается неудачной

Код:

@echo off

setlocal enabledelayedexpansion

call :TestPing[] -debug %1 %2

echo ----------- errorlevel: %errorlevel% ----------
goto :eof



:TestPing[]
:: Parameters: [-debug] IP [PingCount]
if "%1"=="-debug" (
  set TestPing.Debug=Yes
  shift
)
set TestPing.PingCount=%2
if "%TestPing.PingCount%"=="" (
  set TestPing.PingCount=2
)

set TestPing.Out2=B%random%.tmp
set TestPing.Out3=C%random%.tmp

>%TestPing.Out2% (ping -n %TestPing.PingCount% %1)
set TestPing.PingErrorLevel=!errorlevel!
>%TestPing.Out3% (find /C "TTL=" <%TestPing.Out2%)

for /f %%i in (%TestPing.Out3%) do (
    set TestPing.SuccessCount=%%i
)

if %TestPing.PingCount%==%TestPing.SuccessCount% (
  set TestPing.Result=Yes
  if %TestPing.PingErrorLevel%==0 (
      set TestPing.PingErrorLevelResult={valid}
  ) else (
      set TestPing.PingErrorLevelResult={INVALID}
  )
) else (
  if not %TestPing.PingErrorLevel%==0 (
      set TestPing.PingErrorLevelResult={valid}
  ) else (
      set TestPing.PingErrorLevelResult={INVALID}
  )
)

if "%TestPing.Debug%"=="Yes" (
  type %TestPing.Out2%
  echo ------------- results: -------------
  echo Ping count    :      %TestPing.PingCount%
  echo Success count  :      %TestPing.SuccessCount%
  echo Ping errorLevel:      %TestPing.PingErrorLevel% %TestPing.PingErrorLevelResult%
  if "%TestPing.Result%"=="Yes" (
      echo Ping is successful
  ) else (
      echo There is ping error
  )
)

del %TestPing.Out2%
del %TestPing.Out3%

if "%TestPing.Result%"=="Yes" (
  exit /b 0
)
exit /b 1
goto :eof


Результаты работы в эксперименте с бидоном
192.168.0.1 - wifi роутер в host зоне, 192.168.1.100 - телефон в guest зоне

Цитата:

C>TestPing.bat 192.168.1.100 15

Обмен пакетами с 192.168.1.100 по 32 байт:

Ответ от 192.168.0.1: Заданный узел недоступен.
Ответ от 192.168.0.1: Заданный узел недоступен.

Ответ от 192.168.1.100: число байт=32 время=2205мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=5мс TTL=64
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.

Ответ от 192.168.1.100: число байт=32 время=12мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=408мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=228мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=107мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=109мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=325мс TTL=64

Статистика Ping для 192.168.1.100:
Пакетов: отправлено = 15, получено = 10, потеряно = 5 (33% потерь),
Приблизительное время приема-передачи в мс:
Минимальное = 5мсек, Максимальное = 2205 мсек, Среднее = 339 мсек
------------- results: -------------
Ping count : 15
Success count : 8
Ping errorLevel: 0 {INVALID}
There is ping error
----------- errorlevel: 1 ----------

Iska 28-05-2012 00:07 1923677

:(, Anonymоus, чувствую себя тем неграмотным волком из анекдота про волка, лошадь и её задние копыта.

А хоть что говорит такой:
читать дальше »
Код:

Option Explicit

Dim objSWbemObjectEx

For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery( _
        "SELECT * FROM Win32_PingStatus WHERE ADDRESS = '192.168.70.1'")
       
        With objSWbemObjectEx
                If Not IsNull(.StatusCode) Then
                        If .StatusCode = 0 Then
                                WScript.Echo .Address & vbTab & "On" & vbTab & "Response time: " & .ResponseTime & " ms"
                        Else
                                WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
                        End If
                Else
                        WScript.Echo .Address & vbTab & "Not found"
                End If
        End With
Next

WScript.Quit 0


код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)?

CyberMuesli 28-05-2012 00:20 1923683

Цитата:

Цитата Iska
А хоть что говорит такой:
читать дальше »
код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)? »

у меня зацикленный код для телефона в кастрюле + закрытой потом открытой крышкой говорит следующее

192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 On Response time: 5 ms
192.168.1.100 On Response time: 232 ms
192.168.1.100 On Response time: 186 ms
192.168.1.100 On Response time: 212 ms
192.168.1.100 On Response time: 12 ms
192.168.1.100 On Response time: 218 ms

зы. начало цикла надо делать до CreateObject, я правильно понял?

Anonymоus 28-05-2012 07:52 1923745

Iska,
Код:

192.168.70.1        Off        Status code: 11002
CyberMuesli, как вариант, использовать вот такую конструкцию, где будет дополнительно проверяться и наличие потерь:
Код:

Set IP=192.168.70.1&Set i=3
For /F %%I In ('Ping -n %i% %IP%^|Find /C "TTL="') Do (If %%I==%i% Echo Пинг прошел, потерь нету)

Из минусов - слишком громоздко, cтоит использовать лишь там, где процент потерь при пинге действительно нужно учитывать.

Отредактировал второй пост, поправил скрипт, чтобы он учитывал частично прошедший пинг и добавлял статус "Unstable connection" в таком случае.

Iska 28-05-2012 08:47 1923764

CyberMuesli, можно так:
читать дальше »
Код:

Option Explicit

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx

strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

Do
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery( _
                "SELECT * FROM Win32_PingStatus WHERE Address = '192.168.70.1'")
               
                With objSWbemObjectEx
                        If Not IsNull(.StatusCode) Then
                                If .StatusCode = 0 Then
                                        WScript.Echo .Address & vbTab & "On" & vbTab & "Response time: " & .ResponseTime & " ms"
                                Else
                                        WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
                                End If
                        Else
                                WScript.Echo .Address & vbTab & "Not found"
                        End If
                End With
        Next
Loop

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0


вынеся собственно подключение к Wbem за рамки цикла.

Anonymоus, спасибо, ясно. Статус именно тот, что Вы приводили выше на скриншоте:
Цитата:

11002 Destination Net Unreachable
(Win32_PingStatus class). Стало быть, будем знать про такую особенность «ping.exe».

Одно только замечание по коду со скриншота…
читать дальше »
Код:

<command> & echo %Variable%
— он в данном виде непригоден для использования. Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд и будет возвращать код возврата предыдущей команды, а не «<command>».

Iska 28-05-2012 09:04 1923767

Anonymоus, порылся немного. Да, похоже Вы совершенно правы. Вон и Симон рекомендует пользовать исключительно фильтр на TTL (а для полной ясности и вовсе проверять реальную доступность конечного адреса ажник в четыре шага, начиная с localhost и последовательно углубляясь по маршруту): Ping.

Ещё раз спасибо. Будем знать.

CyberMuesli 28-05-2012 10:31 1923796

Цитата:

Цитата Iska
вынеся собственно подключение к Wbem за рамки цикла. »

а, ну да
Цитата:

Цитата Iska
Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд »

плюсану

Dreamer_UFA 28-05-2012 10:34 1923798

Уважемые, возник такой вопрос.
Как можно добавить в скрипт предложенный Anonymous использование переменных.
Так как филиалы разные то и ип адреса тоже. Хотелось бы что бы в тело не лезли.... а прописали где нибудь типа settings.ini.
Ну а сам батник конвертнуть в com или exe....

не силен в скриптовых языках... мозг сломал уже :(

Anonymоus 28-05-2012 12:13 1923836

Dreamer_UFA, сам скрипт:
Код:

@Echo Off
SetLocal EnableDelayedExpansion

If Not Exist "settings.ini" Echo Settings not found&Pause&Exit 1
For /F "usebackq eol=# tokens=1,2* delims==" %%A In ("settings.ini") Do (
        If Not "%%B"=="" Set %%A=%%B
)

Set MsgString="Status:"
:: Получаем набор адресов
Echo Wait...
For /F "tokens=2 delims==" %%A In ('Set Point_') Do (
        For /F "tokens=1,2 delims=:" %%B In ("%%A") Do (
                Echo Checking "%%B"
:: Проверяем на доступность сервера и стабильный пинг к нему
                For /F %%I In ('Ping -n %PacketCount% %%B^|Find /C "TTL="') Do (
                        If %%I==%PacketCount% (Set Result=Online) Else (Set Result=Unstable connection)
                        If %%I==0 Set Result=Not responding
                )
:: Составляем строку с данными для MsgBox'а
                Set MsgString=!MsgString! + vbCrLf + "%%C - !Result!"
        )
)
:: Генерируем и запускаем vbs-скрипт, выводящий данные
Echo MsgBox %MsgString%>"%Temp%\statusmsg.vbs"
"%Temp%\statusmsg.vbs"

Он же, упакованный в exe - http://dl.dropbox.com/u/11632454/dev/random/Pinger.rar

Содержимое файла настроек Settings.ini:
Код:

# Адреса серверов в формате IP:Отображаемое имя
Point_1=192.168.50.1:Billing server
Point_2=192.168.50.5:VPN server
Point_3=192.168.72.11:FTP
Point_4=127.0.0.1:Loopback
Point_5=209.85.148.113:Google.com
Point_6=87.250.250.203:Yandex.ru
# Количество пакетов для команды пинга
PacketCount=5


Dreamer_UFA 28-05-2012 14:03 1923895

Спасибо добрый человек.
буду курить маны по скриптовым языкам.... :)

Dreamer_UFA 28-05-2012 20:24 1924086

Уважаемые гуру а не кинете ссылками на ресурсы по скриптовым языкам ? Что бы рассмотреть команды тут примененные да и вообще для самообразования.
Спрашивать тут уже не удобно, сам думаю как сделать. Может и подскажете.... :)

Хочу теперь результаты пинга вывести в файл в виде "0" и "1", потом на основании этого вывести подсказку что делать. Вывод я сделал, пингуется точка - выводим во временный файл результат. Потом после получения всех результатов объдиняю все это в result.txt.
Получается файл с содержимым:
1
1
1
0
0
1
0

Вот и хочу автоматизировать. Типа программа считывает 0 - определяет недоступность адсл модема - выводит рекомендацию перегрузить модем, проверить коннект проводов и т.д......

Может глупо и не стоит городить на бат`е

Anonymоus 28-05-2012 21:47 1924142

Dreamer_UFA, а прикреплённую тему читали? Там практически всё, что нужно начинающему скриптописателю, остальное без проблем ищется в гугле.

Цитата:

Цитата Dreamer_UFA
выводим во временный файл результат »

Временные файлы - зло и мусор. Всегда, когда это возможно - держите результаты в памяти.

Dreamer_UFA 28-05-2012 21:50 1924147

Спасибо за подсказку. Прикрепленную тему не заметил... сорри.

Тему наверное можно закрыть как решенную. Основной ответ я получил на заданный вопрос. Дальше буду думать сам.

Iska 29-05-2012 07:24 1924255

Цитата:

Цитата Anonymоus
Временные файлы - зло и мусор. »

Почему? Я так не считаю. Главное — нужно держать их действительно в %Temp% и не забывать заботиться об их удалении.

Anonymоus 29-05-2012 08:17 1924266

Iska, насчет временных файлов - скорее, мое личное мнение. Если можно без них обойтись, даже ценой небольшого усложнения скрипта - стараюсь не создавать. Если тут уместна такая аналогия, то это - как верстка таблицами в html. Кроме того, как раз с
Цитата:

Цитата Iska
нужно держать их действительно в %Temp% и не забывать заботиться об их удалении »

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

Iska 29-05-2012 08:45 1924273

Ну, дык, что ж делать :) — бывает, пользователи и зависшие приложения снимают.

CyberMuesli 29-05-2012 12:40 1924407

Цитата:

Цитата Anonymоus
Временные файлы - зло и мусор »

Временные файлы - это современно, модно, актуально и неизбежно. Загляните в temp и temporary internet files :)

Цитата:

Цитата Anonymоus
не всегда бывает легко, иногда пользователи закрывают окно работающего скрипта »

можно предложить в одной из первых строчек скрипта дизейблить крестик закрытия окна

Iska 29-05-2012 17:06 1924551

CyberMuesli, Вы процитировали не меня.

CyberMuesli 29-05-2012 18:07 1924605

Цитата:

Цитата Iska
Вы процитировали не меня. »

поправил)


Время: 17:55.

Время: 17:55.
© OSzone.net 2001-