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 комментария »