Trace-Port

Скрипт для отлавливания подключения на указанный порт, и вывода всего что на него придет. Если указать ключ -Echo то будет отвечать клиенту теми же данными что тот посылает. По умолчанию слушает 23 порт.

По сути просто переписал с примера на MSDN.

function Trace-Port([int]$port=23, [string]$IPAdress="127.0.0.1", [switch]$Echo=$false){
	$listener = new-object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Parse($IPAdress), $port)
	$listener.start()
	[byte[]]$bytes = 0..255|%{0}
	
	write-host "Waiting for a connection on port $port..."
	$client = $listener.AcceptTcpClient()
	write-host "Connected from $($client.Client.RemoteEndPoint)"
	$stream = $client.GetStream()
	while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)
	{
		$bytes[0..($i-1)]|%{$_}
		if ($Echo){$stream.Write($bytes,0,$i)}
	}
	$client.Close()
	$listener.Stop()
	write-host "Connection closed."
}

Использование:

PS L:\PowerShell> Trace-Port -ip 192.168.1.99 -port 333
Waiting for a connection on port 333...

Подключаемся телнетом: telnet 192.168.1.99 333

Connected from 192.168.1.99:61829
84
101
115
116
13
10
Connection closed.

На вывод идет массив байтов, а иногда нужен просто текст:

PS L:\PowerShell> Trace-Port 123 | foreach { write-host ([char]$_) -NoNewLine }
Waiting for a connection on port 123...
Connected from 127.0.0.1:62174
Test
Connection closed.

У скрипта есть один минус, он не многопоточный, выполняется в том же процессе что и PowerShell и соответственно с момента запуска, до разрыва подключения не будет отвечать на Ctrl+C… Но мне пока хватит и этого, дальше копать пока лень🙂

Опубликовано в PowerShell. 4 комментария »

комментария 4 to “Trace-Port”

  1. s7s Says:

    Столкнулся с такой проблемой.
    Выше указаный скрипт слушает порт и выполняет те или иные действия, взависимости от приходяших команд.

    И в одной функции есть необходимость выдержать паузу между действиями. Использую Start-Sleep 1.
    После этого, если разорвать соединение, установить новое неудаеться, так как порт занят. Если убрать Start-Sleep, тогда все нормально. Как можно принудительно освободить порт? И почему порт не закрываеться при
    $client.Close()
    $listener.Stop()
    Хотя работа была завершена корректно?

  2. s7s Says:

    Столкнулся с такой проблемой.
    Выше указаный скрипт слушает порт и выполняет те или иные действия, взависимости от приходяших команд.

    И в одной функции есть необходимость выдержать паузу между действиями. Использую Start-Sleep 1.
    После этого, если разорвать соединение, установить новое неудаеться, так как порт занят. Если убрать Start-Sleep, тогда все нормально. Как можно принудительно освободить порт? И почему порт не закрываеться при
    $client.Close()
    $listener.Stop()
    Хотя работа была завершена корректно?

  3. s7s Says:

    И еще хотел бы узнать. Возможно ли работать через telnet с сертификатами? Не хочу, чтобы любой мог открыть telnet и отправлять команды на сервера, которые там будут исполняться с правами админа. Дырень получаеться. Хочется что бы скрипт как то проверял наличие сертификата у подключившегося. Возможно ли?

  4. Xaegr Says:

    Попробуйте использовать [threading.thread]::sleep(1000) время в мс.

    telnet тут используется просто для подключения к порту и передачи текстовых данных. Можно так же использовать например netcat. Соответственно средства безопасности тут присутствуют только те которые вы напишете сами. Можно и проверку сертификатов прикрутить, и шифрование🙂 А можно взять готовый протокол🙂


Обсуждение закрыто.

%d такие блоггеры, как: