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画面開いて使ってる)