Что нового

[Сеть / Интернет] Повесить CMD на порт.

ZanMax

Тестер
Вот нашол неплохой привет.
Меня интересует можно ли просто повесить CMD на порт без HTML файлов.
А подключатся через Putty (RAW).


http://autoit.rv.ua/files/Network/WebBased.rar

P/S Хочу в своей программе сделать как в Radmin (TELNET)
 

El Panda

Продвинутый
Можно.
1. Открываешь сокет на нужном порту. (кури TCP функции)
2. Слушаешь подключения. Отсекаешь левые запросы.
3. Нужные запросы выполняешь через Run(@ComSpec ...
4. Парсиш результат и отрпвляешь обратно в сокет.
 

Medic84

Омега
Команда форума
Администратор
Предупреждение Нарушение общих правил п. В 8

Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!". Орфографический грамотно составленное сообщение повышает вероятность того, что его прочтут (дочитают до конца) большее количество пользователей этого форума, и как следствие увеличивает шансы для Вас получить быстрый и своевременный ответ на свой вопрос. Проявляйте уважение к другим пользователям форума, ведь может случиться так, что Ваш безграмотный вопрос, в силу плохого знания русского языка, кто-нибудь посчитает за оскорбление. Если по каким-то причинам у Вас плохо с орфографией, то Вы можете воспользоваться сетевыми сервисами для проверки орфографии.
 
Автор
Z

ZanMax

Тестер
Не понимаю такого рода предупреждения и установки статуса под наблюдением :wacko:
Написал все доступно. А если у кого-то нет настроения тогда сори ...
 

Medic84

Омега
Команда форума
Администратор
Ну не для стен же мы правила писали. :-X

При накоплении определенного кол-ва предупреждений(пока не придумали сколько это будет), выдается бан по степени нарушения(Я надеюсь что да такого не дойдет :-\)

Вот как ты сейчас исправил, так и надо было писать с самого начала. И предупреждение не получил бы.
 
Автор
Z

ZanMax

Тестер
Я НЕ ПИСАЛ - "Аффтар выпей йадау!" и такого рода БРЕД. А написал доступно (СМД,ТЕЛНЕТ)
Хватит розводить болтовню.
Прошу удалить предупреждение так как буду писать по нормальному.
СПС.
 

Medic84

Омега
Команда форума
Администратор
Предупреждение будет удалено через пару дней. А то что ты нарушил, я выделил жирным шрифтом.

Разговор окончен.
 
Автор
Z

ZanMax

Тестер
Выкинул все ненужное.
Получил такой код :
При подключении на порт 883 и отправке команды Putty закрывается и паралельно на компе где программа CMD пропадет.
Что делаю не так ? Спасибо.
Код:
#include <TCP.au3>

Opt("TrayMenuMode", 1)
$exit = TrayCreateItem("Exit")
TraySetState()
TraySetToolTip ("RCC")

Const $STDIN_CHILD = 1
Const $STDOUT_CHILD = 2
Const $STDERR_CHILD = 4

Local $Port = 883
Local $CmdWindowOut_Buffer

$Cmd = Run("cmd.exe", @WindowsDir & "\system32\", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)

$CmdServer = _TCP_Server_Create(883)
_TCP_RegisterEvent($CmdServer, $TCP_RECEIVE, "RecivedCommand")

While 1
	If TrayGetMsg() = $exit Then _ExitProcess()
	$CmdWindowOut = StdoutRead($Cmd)
	$CmdWindowErr = StderrRead($Cmd)
	$CmdWindowOut_Buffer = $CmdWindowOut_Buffer & $CmdWindowOut & $CmdWindowErr
WEnd


Func RecivedCommand($CmdSocket, $sReceived, $iError)
	$HTML="TASKLIST"
_TCP_Send($CmdSocket, $HTML)
_TCP_Server_DisconnectClient($CmdSocket)
EndFunc

Func _ExitProcess()
	_TCP_Server_Stop()
	ProcessClose("run.exe")
	Exit
EndFunc
 
Автор
Z

ZanMax

Тестер
Переписал :

Код:
Local $szIPADDRESS = @IPAddress1
 Local $nPORT = 33891
 Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
 Local $msg, $recv
 Local $CmdWindowOut_Buffer

 Const $STDIN_CHILD = 1
 Const $STDOUT_CHILD = 2
 Const $STDERR_CHILD = 4

 $Cmd = Run("cmd.exe", @WindowsDir & "\system32\", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)

 TCPStartup()

  $MainSocket = TCPListen($szIPADDRESS, $nPORT)
  If $MainSocket = -1 Then Exit

$ConnectedSocket = -1


    ;Wait for and Accept a connection
    ;==============================================
    Do
        $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1


    ; Get IP of client connecting
    $szIP_Accepted = SocketToIP($ConnectedSocket)


	While 1
    $CmdWindowOut = StdoutRead($Cmd)
	$CmdWindowErr = StderrRead($Cmd)
	$CmdWindowOut_Buffer = $CmdWindowOut_Buffer & $CmdWindowOut & $CmdWindowErr

        ;$msg = GUIGetMsg()
        ; Try to receive (up to) 2048 bytes
        ;----------------------------------------------------------------
        $recv = TCPRecv($ConnectedSocket, 2048)

        ; If the receive failed with @error then the socket has disconnected
        ;----------------------------------------------------------------
        If @error Then ExitLoop

        ; Update the edit control with what we have received
        ;----------------------------------------------------------------
        If $recv <> "" Then  TCPSend($ConnectedSocket, $CmdWindowOut_Buffer)            ;MsgBox(0,"",$recv)

    WEnd


    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

    TCPShutdown()

Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
            "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0

    Return $aRet
EndFunc   ;==>SocketToIP


Получаю ответ но не то что нужно %)

всегда в ответ :

Код:
Microsoft Windows XP [??ЮА?О 5.1.2600]
(?) ??Ю??Ю?Ф?О ????Ю?А?ДБ, 1985-2001.
Прошу помоч. :-[
 

Medic84

Омега
Команда форума
Администратор
Как я понял проблема с кодировкой?
Код:
Func OemToChar($szSrc) 
Local $placeholder 
    For $i = 0 To StringLen($szSrc) 
        $placeholder &= "  " 
    Next 
    Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str", $placeholder) 
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then 
        Return SetError(0, 0, $lRetVal[2]) 
    EndIf 
 
    Return SetError(1, 0, "") 
 EndFunc

Попробуй с этой функцией.
Использовать как:
Код:
OemToChar("CMD строки")
 

Yashied

Модератор
Команда форума
Глобальный модератор
Код:
If IsArray($lRetVal) And $lRetVal[0] = 1 Then


Одно уточнение. В MSDN нигде ни сказано, что функция OemToChar() возвращает 1. Там говориться, что функция возвращает ненулевое значение. Поэтому, я думаю будет корректнее записать так:

Код:
If IsArray($lRetVal) And ($lRetVal[0] <> 0) Then


или можно так:

Код:
If (Not @error) And $lRetVal[0] Then


:smile:
 

Medic84

Омега
Команда форума
Администратор
Ну функцию сам из архивов взял. Так что могут быть и недочеты :-[
 

Yashied

Модератор
Команда форума
Глобальный модератор
Medic84 сказал(а):
Ну функцию сам из архивов взял. Так что могут быть и недочеты :-[
Я это понял. Кстати я включу эту функцию в WinAPIEx.au3 библиотеку при седующем обновлении (версия 1.9).

:blum:
 
Автор
Z

ZanMax

Тестер
Запускаю скрипт порт (33891)
Запускаю Putty впибаю IP ,порт выбираю Connection Type : Raw
Подключаюсь :
[box title=Putty]
[/box]
В результате получаю на любую команду один ответ.
В чом проблема ? :'(

P.S. Я так понимаю :
Код:
Microsoft Windows XP [<82>?ЮА?О 5.1.2600]
(<91>) <8A>?Ю??Ю?Ф?О <8C>???Ю?А?ДБ, 1985-2001.
находитса тут :
Код:
$CmdWindowOut = StdoutRead($Cmd)
	$CmdWindowErr = StderrRead($Cmd)
	$CmdWindowOut_Buffer = $CmdWindowOut_Buffer & $CmdWindowOut & $CmdWindowErr


А вывожу я так :

Код:
If $recv <> "" Then  TCPSend($ConnectedSocket, $CmdWindowOut_Buffer)


Что не так ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Хе, так AutoIt тут ни причем, поменяй кодировку в самом Putty.
 
Автор
Z

ZanMax

Тестер
Так не в кодировке проблемка :( а в том что не выполняет он команд.
На сколько я понимаю.
 

amel27

Продвинутый
ZanMax сказал(а):
Так не в кодировке проблемка :( а в том что не выполняет он команд.
На сколько я понимаю.
так ты же ничего не передаёшь в CMD - только считываешь...
кстати, кодировка в Putty CP866 без всяких перекодировок
Код:
#include <Constants.au3>

Global $send, $recv
Global $szIPADDRESS = @IPAddress1
Global $nPORT = 33891

$Cmd = Run("cmd.exe", @SystemDir, 0, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)

TCPStartup()
$MainSocket = TCPListen(@IPAddress1, $nPORT, 1)
If $MainSocket = -1 Then Exit

$ConnectedSocket = -1
Do
	$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket >0

$szIP_Accepted = SocketToIP($ConnectedSocket)
ConsoleWrite("CONNECT: "& $szIP_Accepted &@CRLF)

While 1
	; Прием результата из CMD и передача в сеть
	$send &= StdoutRead($Cmd) & StdoutRead($Cmd)
	If $send <> "" Then
		TCPSend($ConnectedSocket, $send)
		ConsoleWrite('SEND: "'& $send &'"'&@CRLF)
		$send = ""
	EndIf
	; Прием команды из сети и передача в CMD
	$recv = TCPRecv($ConnectedSocket, 2048)
	If @error Then ExitLoop
	If $recv <> "" Then
		StdinWrite($Cmd, $recv)
		ConsoleWrite('RECV: "'& $recv &'"'&@CRLF)
		$recv = ""
	EndIf
WEnd

If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
TCPShutdown()

Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet
    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
            "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0
    Return $aRet
EndFunc   ;==>SocketToIP
 
Автор
Z

ZanMax

Тестер
amel27 Спасибо большое.
У меня возникло еще 2 вопросика :
1. Как сделать чтобы после отключение скрипт не вилетал ?
2. Как добавить авторизацию при подключении получать запрос на ввод USERNAME : и PASSWORD :

Спасибо ...
 

amel27

Продвинутый
ZanMax сказал(а):
1. Как сделать чтобы после отключение скрипт не вилетал ?
думаю где-то так:

Код:
#include <Constants.au3>

Global $szIPLocal = @IPAddress1
Global $iPORT = 33891

Global $sSend, $sRecv
Global $iCMD=0, $iErr=0
Global $hMainSocket=-1
Global $hConnSocket=-1

TCPStartup()

While 1
	If $iErr Then
		TCPCloseSocket($hConnSocket)
		TCPCloseSocket($hMainSocket )
		If ProcessExists($iCMD) Then ProcessClose($iCMD)
		
		$hMainSocket = -1
		$hConnSocket= -1
		$iErr = 0
	EndIf

	If $hMainSocket = -1 Then $hMainSocket = TCPListen(@IPAddress1, $iPORT, 1)
	If $hMainSocket >  0 Then
		; Проверка/обработка входящих подключений
		If $hConnSocket= -1 Then
			$hConnSocket = TCPAccept($hMainSocket)
			If $hConnSocket <> -1 Then
				$iCMD = Run("cmd.exe", @SystemDir, 0, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
				TCPConnect($szIPLocal, $iPORT) ; блокируем все подключения на время сеанса
			EndIf
		EndIf
	EndIf
	
	If $hConnSocket > 0 Then
		; Читаем из командной строки
		If $iErr=0 Then $sSend = StdoutRead($iCMD) & StdoutRead($iCMD)
		If @error Then $iErr = 1
		; Передаем в командную строку
		If $iErr=0 And $sRecv <> "" Then StdinWrite($iCMD, $sRecv)
		If @error Then $iErr = 2
		; Получаем из сети
		If $iErr=0 Then $sRecv = TCPRecv($hConnSocket, 2048)
		If @error Then $iErr = 3
		; Отправляем в сеть
		If $iErr=0 And $sSend <> "" Then TCPSend($hConnSocket, $sSend)
		If @error Then $iErr = 4
	EndIf
	
	Sleep(100)
WEnd

Func SocketToIP($hSocket)
	Local $tDockAddr = DllStructCreate("short;ushort;uint;char[8]"), $aRet

	$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $hSocket, _
		"ptr", DllStructGetPtr($tDockAddr), "int*", DllStructGetSize($tDockAddr))
    If @error Or $aRet[0] Then Return SetError(1, 0, "")
	
	$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tDockAddr, 3))
    If @error  Then Return SetError(2, 0, "")
	
    Return $aRet[0]
EndFunc ;=> SocketToIP

Func OnAutoItExit()
	If $hMainSocket >0 Then TCPCloseSocket($hMainSocket)
	If $hConnSocket >0 Then TCPCloseSocket($hConnSocket)
	TCPShutdown()
EndFunc ;=> OnAutoItExit
 
Верх