Home >
Windows にまつわる e.t.c.
PowerShell telnet client class
ネットワーク機器は telnet で設定変更するのですが、これを PowerShell
使って自動化できないかなと始めたのがこの class を作ったスタートでした。
当初は、.NET Framework の telnet client class
を使えば簡単じゃんと思っていたのですが、.NET Framework には telnet client class
なんて便利なものはないってことに気が付き... orz
(telnet client があるスクリプト系って結構多いので、.NET
Framework にもそのくらいはあると思ったのですけど...)
無いのなら自分で作ってしまえって事で作り始めました。
telnet.exe の動きをパケットキャプチャしてみると、telnet プロトコルでは、client と server
間でネゴシエーションしているし... これは RFC 真面目に読まないとって事で久々に RFC
読んで、パケットキャプチャとテスト実装で謎解き開始。
そんなこんなで、PowerShell の class に実装したのがこいつです。
これは何?
PowerShell (v5 以降) で使用できる telnet client class です。
ネットワーク機器等 telnet を使用して設定する機器を自動設定するのに使えます。
何が出来るの?
・機器に対する telnet 接続
・コマンド送信(login / logoff 含む)
・コマンド送信結果受信
・切断
出来ない事
・機器の自動設定 ww
telnet client 機能しか実装していないので、自動設定に必要な処理は自分で書く必要があります。
この class を継承して機器用のカスタムクラスを作るのもよし、この telnet client class
をそのまま使ってスクリプトを書くもよし
同梱しているサンプル実装をお見せすると、こんな感じで使えます。
[ Telnet Client class を継承したクラスを作った場合の実装サンプル ]
# Include
$IncludeFile = Join-Path $PSScriptRoot "sample2Class.ps1"
if( -not (Test-Path $IncludeFile) ){
echo "[FAIL] $IncludeFile not found !"
exit
}
. $IncludeFile
# インスタンス化
$Telnet = New-Object TelnetAllied
# 動作環境変更
# $Telnet.SetEnvironment( $null, 60, $true, $true )
# 接続
$Telnet.Connect( "172.16.0.254", 23 )
# Logon
$Telnet.Logon( "P@$$w0rd" )
# コマンド送信
$ReceiveStrings = $Telnet.SendCommand( "show interface status" )
# 受信内容をテスト表示
foreach( $ReceiveString in $ReceiveStrings ){
echo "[TEST] $ReceiveString"
}
# logoff
$Telnet.Logoff()
|
[ Telnet Client class を裸で使う場合の実装サンプル ]
# Class Include
$IncludeFile = Join-Path $PSScriptRoot "TelnetClient.ps1"
if( -not (Test-Path $IncludeFile) ){
echo "[FAIL] $IncludeFile not found !"
exit
}
. $IncludeFile
# インスタンス化
$Telnet = New-Object TelnetClient
# 動作環境変更
# $Telnet.SetEnvironment( $null, 60, $true, $true )
# 接続
$Telnet.Connect( "172.16.0.254", 23 )
# ネゴシエーションしてログインプロンプトを待つ
$ReceiveStrings = $Telnet.Receive( "login:" )
# ID 送信
$Telnet.Send( "admin", $true )
# パスワードプロンプトを待つ
$ReceiveStrings = $Telnet.Receive( "Password:" )
# パスワード送信
$Telnet.Send( "P@$$w0rd", $false )
# プロンプトを待つ
$ReceiveStrings = $Telnet.Receive( ">" )
# モード変更
$Telnet.Send( "enable", $true )
# パスワードプロンプトを待つ
$ReceiveStrings = $Telnet.Receive( "Password:" )
# パスワード送信
$Telnet.Send( "P@$$w0rd", $false )
# プロンプトを待つ
$ReceiveStrings = $Telnet.Receive( "#" )
# コマンド送信
$Telnet.Send( "show interface status", $true)
# プロンプトを待つ
$ReceiveStrings = $Telnet.Receive( "#" )
# 受信した内容をテスト表示
foreach( $ReceiveString in $ReceiveStrings ){
echo "[TEST] $ReceiveString"
}
# コマンド送信
$Telnet.Send( "disable", $true )
# プロンプトを待つ
$ReceiveStrings = $Telnet.Receive( ">" )
# logoff コマンド送信
$Telnet.Send( "exit", $true )
# 切断
$Telnet.DisConnect()
|
ダウンロード
.zip 配布しているので、PowerShell の wget でダウンロードしてください。
(Web
ブラウザーでダウンロードすると、信頼されていないスクリプトになってしまう)
$DownLoadPath = "C:\TelnetClass"
$DownLoadFile = "TelnetClient.zip"
$DownLoadFilePath = Join-Path $DownLoadPath $DownLoadFile
$URI = "http://www.vwnet.jp/Windows/PowerShell/ps1/TelnetClient.zip"
if(-not(Test-Path $DownLoadPath)){md $DownLoadPath}
wget -OutFile $DownLoadFilePath -Uri $URI
Get-FileHash -Algorithm SHA256 -Path $DownLoadFilePath
ii $DownLoadPath
|
| sha256 ハッシュ |
ED412D52A08C1CAC5A23CA4C689B273C520FABFEE91F206DFE6EF1A1E305D39B |
bitbucket でリポジトリ公開しています
https://bitbucket.org/MURAatVWNET/telnet-client-class
更新履歴
関連情報
PowerShell Class
http://www.vwnet.jp/Windows/etc.asp#PowerShell_Class


Copyright © MURA
All rights reserved.