Что нового

Логирование Telnet

artpluss

Новичок
Сообщения
21
Репутация
0
Здравствуйте.

Есть скрипт подключения по telnet к устройству и запуск команды пинг на этом устройстве.

Код:
If WinExists(@ScriptName) Then Exit
    AutoItWinSetTitle(@ScriptName)

Opt('TrayAutoPause', 0)

$sIp = '192.168.0.1'    ; IP-адрес хоста
$sLogin = 'admin'            ; логин
$sPass = 'password'            ; пароль
$sForWait = ''
$sOut = ''
$LogFile = (@ScriptDir & "\Telnet.log")

;~ For $i=1 to $i=10
;~    $i=$i+1
   $sOutput = _scenario($sIp, $sLogin, $sPass)
;~ Next

Switch @error
    Case 0
;~         MsgBox(0, 'Done', 'Сценарий выполнен успешно' & @CRLF & 'листинг работы в консоли')
        ConsoleWrite($sOutput & @CRLF)
    Case 1
        MsgBox(16, 'Error', 'Ошибка службы TCP')
    Case 2
        MsgBox(16, 'Error', 'Ошибка при создании соединения')
    Case 3
        MsgBox(16, 'Error', 'Устройство не отвечает')
    Case 4
        MsgBox(16, 'Error', 'Вышло время при ожидании данной строки: ' & $sForWait & @CRLF & 'Листинг при ожидании:' & @CRLF & $sOut)
EndSwitch

Func _scenario($sInIp, $sInLogin, $sInPass)
    TCPStartup()
    If @error Then Return SetError(1)                ; ошибка службы
    $socket = TCPConnect($sInIp, 2323)                ; создаем сокет с хостом по 2323 порту
    If @error Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(2)                            ; ошибка при создании сокета
    EndIf
    $sForWait = ':'
    $sStream = _StartListener($socket, $sForWait)    ; ждем приглашение ':' для ввода логина
    If @error = 1 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(3)                            ; хост не отвечает
    ElseIf @error = 2 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(4)                            ; вышло время ожидания строки от хоста
    EndIf
    TCPSend($socket, $sInLogin & @CRLF)                ; отсылаем логин
    $sForWait = ':'
    $sStream = _StartListener($socket, $sForWait)    ; ждем приглашение ':' для ввода пароля
    If @error = 1 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(3)                            ; хост не отвечает
    ElseIf @error = 2 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(4)                            ; вышло время ожидания строки от хоста
    EndIf
    TCPSend($socket, $sInPass & @CRLF)                ; отсылаем пароль
    $sForWait = '#'
    $sStream = _StartListener($socket, $sForWait)    ; ждем '#' для ввода команд
    If @error = 1 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(3)                            ; хост не отвечает
    ElseIf @error = 2 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(4)                            ; вышло время ожидания строки от хоста
     EndIf

    TCPSend($socket, 'ping -c 5 192.168.0.10' & @CRLF)    ; отсылаем команду

    $sForWait = '#'
    $sStream = _StartListener($socket, $sForWait)    ; ждем '#' после окончания выполнения команды
    If @error = 1 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(3)                            ; хост не отвечает
    ElseIf @error = 2 Then
        TCPCloseSocket($socket)
        TCPShutdown()
        Return SetError(4)                            ; вышло время ожидания строки от хоста
    EndIf
    TCPCloseSocket($socket)
    TCPShutdown()
    Return $sStream                                    ; выдача листинга
EndFunc

Func _StartListener($sock, $sWait, $iTimer = 30000)
    $iTimer = Int($iTimer)                                                ; перевод времени таймера из строчнойй формы в цифровую
    $sOut = ''
    $hTimer = TimerInit()                                                ; инициирование таймера, для ограничения времени ожидания ответов
    While 1
        $sRcv = TCPRecv($sock, 10000)                                    ; чтение данных с порта
        If StringLen($sRcv) <> 0 And StringInStr($sRcv, $sWait) Then    ; если пришли данные, и они содержат искомую строку - выход с выводом
            $sOut = $sRcv
            Return $sOut
        ElseIf StringLen($sRcv) <> 0 Then                                ; если пришли данные, но они не содержат искомую строку - ждем
            $hTimer = TimerInit()                                        ; заново инициируем таймер уже для ожидания нужной строки
            $sOut = $sRcv
            If StringInStr($sRcv, '--More--') Then                        ; пришла строка "--More--" (при многостраничной выдаче)
                TCPSend($sock, ' ')                                        ; отсылаем пробел для "пролистывания"
                $hTimer = TimerInit()                                    ; заново инициируем таймер
            EndIf
            Do                                                            ; чтения данных с порта в цикле, до прихода нужной строки
                $sRcv = TCPRecv($sock, 10000)
                If StringLen($sRcv) <> 0 Then
                    If StringInStr($sRcv, '--More--') Then                ; пришла строка "--More--" (при многостраничной выдаче)
                        TCPSend($sock, ' ')                                ; отсылаем пробел для "пролистывания"
                        $hTimer = TimerInit()                            ; заново инициируем таймер
                    EndIf
                    $sOut &= $sRcv
                EndIf
                Sleep(5)
                If TimerDiff($hTimer) > $iTimer Then Return SetError(2)    ; время ожидания строки вышло - выход с ошибкой
            Until StringInStr($sRcv, $sWait)
            Return $sOut                                                ; нормальный выход с выводом
        EndIf
        Sleep(50)
        If TimerDiff($hTimer) > $iTimer Then Return SetError(1)            ; время ожидания какого-либо ответа от хоста вышло - выход с ошибкой
    WEnd
 EndFunc


Помогите пожалуйста сделать следующее:

1) Скрипт работает хорошо, но мне необходимо, чтобы как только команда пинг вернет ответ ПРЕВЫШЕН ИНТЕРВАЛ ОЖИДАНИЯ ЗАПРОСА происходила запись этого события в LOG файл с указанием даты и времени, а выполнение команды продолжалось дальше.
2) Сейчас команда пинг отрабатывает 5 раз, а нужно, чтобы был бесконечный цикл пока я не остановлю ее сам или например до наступления определенной даты и времени
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
использовать команду ping через командную строку и в цикле считывать значения. примеры как читать из командной строки есть на форуме
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Можно использовать "Ping" не из командной строки , а встроенную функцию - пример из справки :
Код:
; Пинг сайта AutoIt каждые 250 миллисекунд
$iPing = Ping("www.AutoItScript.com", 250)
If $iPing Then ; также возможно:  If @error = 0 Then ...
    MsgBox(4096, "Состояние", "В онлайне, задержка ответа: " & $iPing)
Else
    MsgBox(4096, "Состояние", "Произошла ошибка, @error=" & @error)
EndIf

происходила запись этого события в LOG файл с указанием даты и времени
Для этого очень удобно использовать функцию "_FileWriteLog" , пример из справки :
Код:
#include <File.au3>

; Пример 1
Local $hFile = FileOpen(@ScriptDir & "\Example.log", 1) ; Открывает лог-файл в режиме записи.
_FileWriteLog($hFile, "Текст 1") ; Записывает в лог-файл передавая дескриптор возвращённый функцией FileOpen.
FileClose($hFile) ; Закрывает дескриптор, освобождая файл.

; Example 2
_FileWriteLog(@ScriptDir & "\Example.log", "Текст 2") ; Записывает в лог-файл передавая путь.
 
Последнее редактирование:
Верх