ネットで調べても、まともに PowerShell に telnet プロトコルをしゃべらせて
Linux に繋げられるサンプルコードが見つからなかったので作ってみた。
かるく遊んだだけなんで、ちゃんといろいろ制御はしてないけど(^^ゞ
PowerShell は、.NET が使えるからいろいろ使えそうですね。
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
}