ネットで調べても、まともに PowerShell に telnet プロトコルをしゃべらせて
Linux に繋げられるサンプルコードが見つからなかったので作ってみた。

かるく遊んだだけなんで、ちゃんといろいろ制御はしてないけど(^^ゞ

PowerShell は、.NET が使えるからいろいろ使えそうですね。

## telnet-robot.ps1
## Interact with a service on a remote TCP port
param( [string] $remoteHost = "ukikusa",
[int] $port = 23, [string[]] $commands = @("pwd", "ls -ld *"))
$TempLogFilePath = "c:\users\kotora\Temp.log"
Start-Transcript -Path "$TempLogFilePath"
try {
## Open the socket, and connect to the computer on the specified port
write-host "Connecting to $remoteHost on port $port`r`n"
$socket = new-object System.Net.Sockets.TcpClient($remoteHost, $port)
if($socket -eq $null) { throw ("Could Not Connect") } write-host "Connected $remoteHost on port $port`r`n"
$stream = $socket.GetStream()
$writer = new-object System.IO.StreamWriter($stream)
$buffer = new-object System.Byte[] 1024 $nego = new-object System.Byte[] 1024 $encoding = new-object System.Text.UTF8Encoding # Telnet Negotiation $IAC = 255 # interpret as command: $DONT = 254 # you are not to use option $DO = 253 # please, you use option $WONT = 252 # I won't use option $WILL = 251 # I will use option $SB = 250 # interpret as subnegotiation $GA = 249 # you may reverse the line $EL = 248 # erase the current line $EC = 247 # erase the current character $AYT = 246 # are you there $AO = 245 # abort output--but let prog finish $IP = 244 # interrupt process--permanently $BREAK= 243 # break $DM = 242 # data mark--for connect. cleaning $NOP = 241 # nop $SE = 240 # end of record (transparent mode) $EOR = 239 # end of record (transparent mode) $ABORT= 238 # Abort process $SUSP = 237 # Suspend process $xEOF = 236 # End of file: EOF is already used...
$TELOPT_BINARY = 0 $TELOPT_ECHO = 1 $TELOPT_SGA = 3 $TELOPT_NAWS = 4 $TELOPT_STATUS = 5 $TELOPT_TTYPE = 24 $TELOPT_TSPEED = 32 $TELOPT_XDISPLOC = 35 $TELOPT_NEW_ENVIRON = 39 $TELQUAL_IS = 0 $TELQUAL_SEND = 1 $TELQUAL_INFO = 2 $TELQUAL_REPLY = 2 $TELQUAL_NAME = 3 $CR = "`r`n" $debug = 0
## ## Telnet Negitiation # STAGE1 start-sleep -m 500 if($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) if($buffer[0] -eq $IAC) { if($debug -eq 1) { write-host Recieve1: $CR for($i=0; $i -lt $read; $i++) { write-host $buffer[$i] } write-host Reply1: $CR } for($c=0; $buffer[$c] -ne 0; $c+=3) { if($buffer[$c+1] -eq $DO) { if($buffer[$c+2] -eq $TELOPT_TSPEED) { $nego = $IAC,$WONT,$TELOPT_TSPEED $stream.Write($nego, 0, $nego.Length) } else { $nego = $IAC,$WILL,$buffer[$c+2] $stream.Write($nego, 0, $nego.Length) } $stream.Flush() if($debug -eq 1) { write-host $nego $CR } } } } } # STAGE2 start-sleep -m 500 if($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) if($buffer[0] -eq $IAC) { if($debug -eq 1) { write-host Recieve2: $CR for($i=0; $i -lt $read; $i++) { write-host $buffer[$i] } } for($c=0; $buffer[$c] -ne 0; $c+=6) { if($buffer[$c+1] -eq $SB) { switch($buffer[$c+2]) { $TELOPT_XDISPLOC { $nego = $IAC,$SB,$TELOPT_XDISPLOC,0,80,0,24,$IAC,$SE,$DO,0x01 $stream.Write($nego, 0, $nego.Length) } $TELOPT_NEW_ENVIRON { $nego = $IAC,$SB,$TELOPT_NEW_ENVIRON,$TELQUAL_IS,$IAC,$SE,$DO,0x01 $stream.Write($nego, 0, $nego.Length) } $TELOPT_TTYPE { $nego = $IAC,$SB,$TELOPT_TTYPE,$TELQUAL_IS,$IAC,$SE,$DO,0x01 $stream.Write($nego, 0, $nego.Length) } } } $stream.Flush() if($debug -eq 1) { write-host $nego $CR } } } } # STAGE3 start-sleep -m 500 if($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) if($buffer[0] -eq $IAC) { if($debug -eq 1) { write-host Recieve3: $CR for($i=0; $i -lt $read; $i++) { write-host $buffer[$i] } } for($c=0; $buffer[$c] -ne 0; $c+=3) { if($buffer[$c+1] -eq $DO) { $nego = $IAC,$WONT,$buffer[$c+2] $stream.Write($nego, 0, $nego.Length) $stream.Flush() if($debug -eq 1) { write-host $nego $CR } } } } } # Login $user = "USER" $passwd = "PASSWORD" start-sleep -m 3000 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine("") $writer.Flush() } else { throw ("No response negoation`r`n") } start-sleep -m 500 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine("") $writer.Flush() } else { throw ("No response user`r`n") } start-sleep -m 3000 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine($user) $writer.Flush() } else { throw ("No response password`r`n") } start-sleep -m 500 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine($passwd) $writer.Flush() } else { throw ("No response user`r`n") } # Switch User start-sleep -m 500 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine("su -") $writer.Flush() } else { throw ("No response login`r`n") } start-sleep -m 3000 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine($passwd) $writer.Flush() } else { throw ("No response user`r`n") } # Operation for($i=0; $i -le $commands.Count; $i++) { start-sleep -m 500 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) if($buffer[0] -eq $IAC) { for($c=0; $c -lt $read; $c++) { write-host $buffer[$c] } } write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine($commands[$i]) $writer.Flush() } else { throw ("No response $command[$i]`r`n") } } # exit start-sleep -m 500 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine("exit") $writer.Flush() } else { throw ("No response commands`r`n") } start-sleep -m 500 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine("exit") $writer.Flush() } else { throw ("No response commands`r`n") } start-sleep -m 500 if ($stream.DataAvailable) { while($stream.DataAvailable) { $read = $stream.Read($buffer, 0, 1024) write-host -n ($encoding.GetString($buffer, 0, $read)) } $writer.WriteLine("exit") $writer.Flush() } else { throw ("No response exit commands`r`n") } #runs CheckLogs.ps1 script and sends in the output from # the telnet emulation and searches for HTML string .\CheckLogs.ps1 -LogFile "$TempLogFilePath" -SearchStrings @('akashi') if($LASTEXITCODE -eq 0) { # If string wasnt found then an error is thrown and caught throw ("Text Not found") } } catch { #When an exception is thrown catch it and output the error. #this is also where you would send an email or perform # the code you want when its classed as down. write-host $error[0] $dateTime = get-date $errorOccurence = "Error occurred connecting to $remoteHost on $port at $dateTime" write-host $errorOccurence } finally { write-host `r`n write-host exit program.`r`n ## Close the streams ## Cleans everything up. $writer.Close() $stream.Close() stop-transcript }