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

 

更新履歴

2017/09/03 公開

 

関連情報

PowerShell Class
http://www.vwnet.jp/Windows/etc.asp#PowerShell_Class

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.