Что нового

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

ZanMax

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


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

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

El Panda

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

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Предупреждение Нарушение общих правил п. В 8

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

ZanMax

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

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Ну не для стен же мы правила писали. :-X

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

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

ZanMax

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

Medic84

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

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

ZanMax

Тестер
Сообщения
120
Репутация
5
Выкинул все ненужное.
Получил такой код :
При подключении на порт 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

Тестер
Сообщения
120
Репутация
5
Переписал :

Код:
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

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Как я понял проблема с кодировкой?
Код:
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

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Medic84 сказал(а):
Ну функцию сам из архивов взял. Так что могут быть и недочеты :-[

Я это понял. Кстати я включу эту функцию в WinAPIEx.au3 библиотеку при седующем обновлении (версия 1.9).

:blum:
 
Автор
Z

ZanMax

Тестер
Сообщения
120
Репутация
5
Запускаю скрипт порт (33891)
Запускаю Putty впибаю IP ,порт выбираю Connection Type : Raw
Подключаюсь :
[box title=Putty]
putty.jpg
[/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

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

ZanMax

Тестер
Сообщения
120
Репутация
5
Так не в кодировке проблемка :( а в том что не выполняет он команд.
На сколько я понимаю.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
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

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

Спасибо ...
 

amel27

Продвинутый
Сообщения
146
Репутация
55
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
 
Верх