telnetな電子公告をPowerShellで読み書きする

 一部で話題のtelnet電子公告に関するコメントを眺めてたら

あれはtelnetではなくただのsocket通信では?

netcatで読むのが便利(ncat ならssl通信もできるし)

的な話があった。確かにそうだなと思い、socket通信ならWindowsにわざわざtelnetを追加しなくてもPowerShellでいいのでは?とちょこっと調べて書いてみた:

$hostname = "koukoku.shadan.open.ad.jp"

$port = 23
$enc_name = 'shift_jis'

$start_cmd = "notalk"

$encoding = [System.Text.Encoding]::GetEncoding($enc_name)

$socket = New-Object System.Net.Sockets.TcpClient($hostname, $port)
$stream = $socket.GetStream()

$writer = New-Object System.IO.StreamWriter($stream, $encoding)
$writer.WriteLine($start_cmd);
$writer.Flush()

$reader = New-Object System.IO.StreamReader($stream, $encoding)
while (($line = $reader.ReadLine()) -ne $null) {
    Write-Output $line
}

$socket.Close()

 いちおうこんな感じで動くっぽい。

 もっといい感じの書き方がありそうな気がするけど、PowerShellは全然触ったことないからモダンな書き方が分からない。

 SSL版だとこんな感じ:

$hostname = "koukoku.shadan.open.ad.jp"

$port = 992
$enc_name = 'utf-8'

$start_cmd = "notalk"

$encoding = [System.Text.Encoding]::GetEncoding($enc_name)

$socket = New-Object System.Net.Sockets.TcpClient($hostname, $port)
$stream = $socket.GetStream()

$sslStream = New-Object System.Net.Security.SslStream($stream, $false)
$sslStream.AuthenticateAsClient($hostname)

$writer = New-Object System.IO.StreamWriter($sslStream, $encoding)
$writer.WriteLine($start_cmd);
$writer.Flush()

$reader = New-Object System.IO.StreamReader($sslStream, $encoding)
while (($line = $reader.ReadLine()) -ne $null) {
    Write-Output $line
}

$socket.Close()

 個人的には"notalk"の部分を"nobody"にしてチャットだけ見てたり、$writer.WriteLine() に$argsを書いてチャット投稿するコマンドを作ったりしています。

(2画面開いて使ってる)