Redline
AutoIT Гуру
- Сообщения
- 506
- Репутация
- 375
Связка из двух функций, для автоматизации telnet-соединений, все построено на принципе ожидания определенной строки/символа.
Первая - это сценарий для работы с устройством (может меняться в зависимости от нужд и типа хоста)
Вторая - непосредственно работа с telnet
Функции не универсальны, при необходимости их можно переделать под конкретные условия.
Первая - это сценарий для работы с устройством (может меняться в зависимости от нужд и типа хоста)
Вторая - непосредственно работа с telnet
Функции не универсальны, при необходимости их можно переделать под конкретные условия.
Код:
$sIp = '123.123.123.123' ; IP-адрес хоста
$sLogin = 'user' ; логин
$sPass = 'passwd' ; пароль
$sForWait = ''
$sOut = ''
$sOutput = _scenario($sIp, $sLogin, $sPass)
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, 23) ; создаем сокет с хостом по 23 порту
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, 'command' & @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