Microsoft .NET FrameworkとTera Term MACROを利用して作成したオートログインツール[Windows PowerShell][Tera Term]

実行環境
Windows PowerShell 5.1
Tera Term Version 4.106
CentOS release 6.7

前回前々回の記事で紹介した内容を組み合わせて作成した、GUIのオートログインツールです。

# AutoLoginTeraterm.ps1
#
# 変数の定義 -----------------------------------------------------------
# DefaultAccount.csv(デフォルトで表示させたいユーザーとパスワードをカンマ区切りで記載)
$defaultAccountFile = "DefaultAccount.csv"

# IpList.csv(コンボボックスで表示させたいIPを改行区切りで記載)
$ipListFile = "IpList.csv"

# ttpmacro.exeのパス
$ttpmacro = "C:\Program Files (x86)\teraterm\ttpmacro.exe"

# 外部ファイルの読み込み -----------------------------------------------
# IpList.csvの存在を確認
if (Test-Path $PSScriptRoot\$ipListFile) {
    $ipList = Get-Content $PSScriptRoot\$ipListFile
} else {
    $ipList = ""
}

# DefaultAccount.csvの存在を確認
if (Test-Path $PSScriptRoot\$defaultAccountFile) {
    $defaultAccount = Get-Content $PSScriptRoot\$defaultAccountFile
} else {
    $defaultAccount = ""
}

# ----------------------------------------------------------------------
# logディレクトリの存在を確認
if ( -not ( Test-Path $PSScriptRoot"\log" ) ) {
    New-Item $PSScriptRoot"\log" -ItemType Directory
}

# .NET Frameworkクラス(System.DrawingとSystem.Windows.Forms)の読み込み
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# Font
$font = New-Object System.Drawing.Font("メイリオ",11)

# Tooltip
$tooltip = New-Object System.Windows.Forms.Tooltip
$tooltip.ShowAlways = $True
$tooltip.ToolTipIcon = "none"
$tooltip.ToolTipTitle = "説明"
$tooltip.UseFading = $False
$tooltip.AutoPopDelay = 3000

# Form
$form = New-Object System.Windows.Forms.Form
$form.Text = 'オートログインツール'
$form.AutoSize = $true
$form.StartPosition = 'CenterScreen'

# 対象サーバーGroupBox -----------------------------------------------------
$groupBox0 = New-Object System.Windows.Forms.GroupBox
$groupBox0.Location = New-Object System.Drawing.Point(10,10)
$groupBox0.AutoSize = $true
$groupBox0.text = "対象サーバー"

# label0
$label0 = New-Object System.Windows.Forms.Label
$label0.Location = New-Object System.Drawing.Point(10,40)
$label0.AutoSize = $true
$label0.Text = 'IP'

# label1
$label1 = New-Object System.Windows.Forms.Label
$label1.Location = New-Object System.Drawing.Point(10,90)
$label1.AutoSize = $true
$label1.Text = 'ユーザー'

# label2
$label2 = New-Object System.Windows.Forms.Label
$label2.Location = New-Object System.Drawing.Point(10,140)
$label2.AutoSize = $true
$label2.Text = 'パスワード'

# comboBox0
$comboBox0 = New-Object System.Windows.Forms.ComboBox
$comboBox0.Location = New-Object System.Drawing.Point(90,30)
$comboBox0.Size = New-Object System.Drawing.Size(150,0)
$comboBox0.Font = $font
$comboBox0.Add_MouseHOver({$tooltip.SetToolTip($comboBox0,"IPアドレスを選択して下さい。")})

foreach ($item in $ipList)
{
    $comboBox0.Items.Add($item)
}

# textBox0
$textBox0 = New-Object System.Windows.Forms.TextBox
$textBox0.Location = New-Object System.Drawing.Point(90,80)
$textBox0.Size = New-Object System.Drawing.Size(150,0)
$textBox0.Font = $font
$textBox0.Text = $defaultAccount.Split(',')[0]
$textBox0.Add_MouseHOver({$tooltip.SetToolTip($textBox0,"ユーザーを入力して下さい。")})

# textBox1
$textBox1 = New-Object System.Windows.Forms.TextBox
$textBox1.Location = New-Object System.Drawing.Point(90,130)
$textBox1.Size = New-Object System.Drawing.Size(150,0)
$textBox1.Font = $font
$textBox1.Text = $defaultAccount.Split(',')[1]
$textBox1.PasswordChar = '*'
$textBox1.Add_MouseHOver({$tooltip.SetToolTip($textBox1,"パスワードを入力して下さい。")})

$groupBox0.Controls.AddRange(@($label0,$label1,$label2,$comboBox0,$textBox0,$textBox1))

# 実行GroupBox -------------------------------------------------------
$groupBox1 = New-Object System.Windows.Forms.GroupBox
$groupBox1.Location = New-Object System.Drawing.Point(10,210)
$groupBox1.AutoSize = $true
$groupBox1.text = "実行"

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(10,30)
$okButton.AutoSize = $true
$okButton.Text = 'OK'
$okButton.Add_MouseHOver({$tooltip.SetToolTip($okButton,"対象サーバーにログインします。")})

$okButton.Add_Click({
    # ttpmacro.exeの存在を確認
    if ( -not ( Test-Path $ttpmacro ) ) {
        [System.Windows.Forms.MessageBox]::Show($ttpmacro + " が存在しません。","Result","OK","Warning")
    } else {
        # CallMain.ttlの存在を確認
        if (Test-Path $PSScriptRoot"\CallMain.ttl") {
            Remove-Item $PSScriptRoot"\CallMain.ttl"
        }

        # CallMain.ttlを作成
        $callMain = "myserver = '" + $comboBox0.Text + "'`n"
        $callMain = $callMain + "username = '" + $textBox0.Text + "'`n"
        $callMain = $callMain + "password = '" + $textBox1.Text + "'`n"
        $callMain = $callMain + "prompt = username`n"
        $callMain = $callMain + "strconcat prompt '@'`n"
        $callMain = $callMain + "include 'Main.ttl'`n"
        $callMain | Out-File $PSScriptRoot"\CallMain.ttl" -Encoding utf8

        # ttpmacroでCallMain.ttlを実行
        & $ttpmacro $PSScriptRoot"\CallMain.ttl"
    }
})

$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(100,30)
$cancelButton.AutoSize = $true
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$cancelButton.Add_MouseHOver({$tooltip.SetToolTip($cancelButton,"ツールを終了します。")})
$form.CancelButton = $cancelButton

$groupBox1.Controls.AddRange(@($okButton,$cancelButton))

# ----------------------------------------------------------------------
$form.Controls.AddRange(@($groupBox0,$groupBox1))

# comboBox0にフォーカスを設定
$form.Add_Shown({$comboBox0.Select()})

# Enterキーを押したときにクリックされるボタンをokButtonに設定
$form.AcceptButton = $okButton

# フォームをモーダルダイアログボックスとして表示
$result = $form.ShowDialog()

変数$ttpmacroでは、実際のttpmacro.exeのパスを定義して下さい。

; Main.ttl
;
; 指定したサーバーに接続する。 -----------------------------------------
command = myserver
strconcat command ' /ssh /2 /auth=password /user='
strconcat command username
strconcat command ' /passwd='
strconcat command password

; myserverに接続する。 
connect command

; ログファイル名、保存先を定義する。 -----------------------------------
; MACRO の現在のディレクトリを取得する。 
getdir dir

; Tera Term の現在のディレクトリをlogに変更する。 
strconcat dir '\log'
changedir dir

; 日時を取得する。
gettime timestr "%Y%m%d-%H%M%S"

; ログファイル名に接続先ipと日時を入れる。
sprintf2 filename 'console_%s_%s.log' myserver timestr

; Tera Term のログ取得を追記モードで開始する。 
logopen filename 0 1

; ログイン後に実行したいコマンドを記載する。 ---------------------------
; サブルーチンをコールする。 
call sub

; \[\e[1;32m\] 太字;文字色緑
; \[\e[1;36m\] 太字;文字色水
; \[\e[0;39m\] 太字;文字色デフォルト
sendln 'export PS1="[\t][\[\e[1;32m\]\u\[\e[0;39m\]@\[\e[1;36m\]\h\[\e[0;39m\]]# "'
call sub

sendln 'id; uname -n'
call sub

sendln 'date'
call sub

; マクロの実行を終了する。 
end

; サブルーチンの始まり。 -----------------------------------------------
:sub
    ; 200ミリ秒休止する。
    mpause 200

    ; 3回繰り返す。
    for i 1 3
        ; 変数 promptを待つ。
	wait prompt

        ; 改行を送信する。
        sendln
    next

; メインルーチンへもどる。
return
REM オートログインツール.bat

@ECHO OFF
powershell -ExecutionPolicy Bypass -command %~dp0AutoLoginTeraterm.ps1

上記3つのファイル(AutoLoginTeraterm.ps1、Main.ttl、オートログインツール.bat)とDefaultAccount.csv、IpList.csvを作成し、同じディレクトリに格納して下さい。
DefaultAccount.csvにはデフォルトで表示させたいユーザーとパスワードをカンマ区切りで、IpList.csvにはコンボボックスで表示させたいIPを改行区切りで記載します。

オートログインツール.batを実行することで、冒頭で紹介したメニュー画面が起動します。
入力したIP、ユーザー、パスワードをもとにCallMain.ttlを作成して呼び出し、CallMain.ttlからMain.ttlを呼び出す仕組みになっています。

以上、Microsoft .NET FrameworkとTera Term MACROを利用して作成したオートログインツールでした。

いいなと思ったら応援しよう!