Tera Termマクロ(TTL)を記述している際に、「接続するホスト名やIPIP [アイピー]Internet Protocol。インターネット通信の基本プロトコルアドレスを固定せず、実行するたびに入力させたい」「作業ごとに異なるコマンドを動的に渡せるようにしたい」と悩んだことはありませんか。接続先や処理内容をマクロファイル内に直接書き込んでしまうと、環境が変わるたびにファイルを修正する手間が発生します。
この記事を読むと、inputboxコマンドを利用してダイアログボックス経由で動的なユーザー入力を受け取る方法が分かるようになります。これにより、コードの書き換えが不要な柔軟性の高い汎用マクロを作成できるようになり、日々の業務効率化につながります。
確認した環境
本記事で解説する手順およびサンプルコードは、以下の環境で動作を確認しています。
- OSOS [オーエス]Operating System。基本ソフトウェア: Windows 11 Pro (バージョン 23H2)
- ターミナルエミュレーター: Tera Term (バージョン 5.3)
- 接続先ターゲット例: AlmaLinux 9.3(一般ユーザーでのSSHSSH [エスエスエイチ]Secure Shell。暗号化されたリモート接続プロトコル接続)
Tera Termマクロのinputboxとは?
Tera Termマクロのinputboxは、画面上に小さな入力ダイアログボックスを表示し、ユーザーがキーボードから入力した文字列をマクロ内の変数に格納するためのコマンドです。固定の値を処理するだけでなく、実行時の状況に応じた対話的な操作を実現する上で重要なコマンドであると言えます。
inputboxコマンドの基本構文と引数
inputboxコマンドは、以下のような構文で使用します。
inputbox <メッセージ> <タイトル> [<初期値>]主な引数は以下の通りです。
- 第1引数(
<メッセージ>): ダイアログ内に表示され、ユーザーに入力を促すメッセージ(文字列)を指定します。 - 第2引数(
<タイトル>): ウィンドウのタイトルバーに表示されるタイトル(文字列)を指定します。 - 第3引数(
<初期値>・省略可): 入力欄(エディットコントロール)にあらかじめ表示しておくデフォルトの文字列を指定します。省略した場合は空文字列("")が設定されます。
※公式構文では第4引数 [<special>] も定義されていますが、現在は非推奨とされており、特殊文字を扱う場合は strspecial コマンドの使用が推奨されています。
inputboxを実行すると、入力された文字列が自動的にシステム変数 inputstr に格納されます。通常の戻り値としてシステム変数 result を利用する仕様ではないため、入力値の判定には inputstr を使用します。
なお、検証環境(Tera Term 5.3)の実機動作では、inputbox ダイアログには「OK」ボタンのみが表示され、「キャンセル」ボタンは表示されません(右上の「×」ボタンや Esc キーでも閉じられない動作となります)。キャンセル操作を含めたダイアログの終了動作は、利用するTera Termのバージョンでもあわせて確認しておきましょう。
passwordboxとの違い
inputbox とよく似たコマンドに passwordbox があります。それぞれの用途と違いは以下の通りです。
| コマンド | 主な用途 | 入力文字列の表示 |
|---|---|---|
inputbox | ホスト名・IPアドレス・実行コマンドなどの入力 | 通常表示(そのまま表示) |
passwordbox | パスワード・パスフレーズなどの機密情報の入力 | マスク表示(**** などで隠す) |
パスワードを入力させる場合は、画面上から文字列が読み取られないよう inputbox ではなく passwordbox を使用するか、後述する connect コマンドの /ask4passwd オプションを使用するのが適切です。
inputboxを使うメリットと活用シーン
ホスト名やパラメータをスクリプトの外部から都度受け渡すことにより、以下のようなシーンで役立ちます。
- 接続先IPアドレスやホスト名が日によって、あるいは作業対象のサーバーごとに異なる場合
- 実行するバッチ処理のパラメータや任意のコマンド名を対話形式で指定したい場合
- 同じマクロファイルを複数のエンジニアで共有し、それぞれの環境や権限に合わせて安全に使い回したい場合
- 定型的なルーチンワークにおいて、誤操作を防ぐためにパラメータの手入力を強制させたい場合
inputboxを使ったサンプルマクロスクリプト
ここでは、実際に inputbox を組み込んだTera Termマクロの具体的なサンプルコードを紹介します。
ホスト名や接続IPを対話式で指定する例
以下のスクリプトは、マクロの起動時にダイアログを表示し、ユーザーが入力したIPアドレスに対して一般ユーザー(例: admin)でSSH接続を試みるサンプルです。
※AlmaLinux 9系などの標準的な環境では、root ユーザーのSSHログインが制限されていることが多いため、一般ユーザーで接続し必要に応じて sudo 等を使用する運用を想定しています。
; ==========================================================; 対話式ホスト接続マクロ; ==========================================================
; 1. ユーザーに入力ダイアログを表示する(第3引数で初期値を指定)inputbox '接続先のIPアドレスまたはホスト名を入力してください:' 'ホスト接続マクロ' '192.168.1.10'
; 2. 入力値が空(ブランク)の場合のバリデーションstrcompare inputstr ''if result = 0 then messagebox 'IPアドレスが入力されていません。マクロを終了します。' 'エラー' endendif
; 3. 入力された文字列を独自変数に退避するtarget_host = inputstr
; 4. 接続コマンドの構築と実行(パスワードは /ask4passwd で実行時に入力)msg = target_hoststrconcat msg ':22 /2 /ssh /auth=password /user=admin /ask4passwd'
; 接続実行connect msgif result != 2 then messagebox 'サーバーへの接続に失敗しました。' '接続エラー' endendif
; 5. 接続後の初期コマンド送信例(タイムアウトを30秒に設定)timeout = 30wait '$'if result = 0 then messagebox '接続後のプロンプトを確認できませんでした。' 'タイムアウト' endendif
sendln 'hostname -I'入力値(inputstr)を別の変数に退避する理由
上記のサンプルでは、target_host = inputstr のようにシステム変数 inputstr の値を独自の変数に代入して退避しています。
Tera Termマクロにおいて、inputstr は他のコマンドでも共用されるシステム変数です。例えば、再度 inputbox や passwordbox を実行した場合や、通信処理で recvln や waitln、sprintf などを実行した際にも inputstr の中身が上書きされます。そのため、後続の処理でも入力値を再利用する場合は、取得直後に独自変数へ退避しておくのが安全です。
取得した入力値をそのままコマンドに渡す方法
接続完了後に、サーバー上で実行するコマンドを inputbox で受け取り、動的にリモートのコマンドライン(CLICLI [シーエルアイ]Command Line Interface。コマンドで操作するインターフェース)へ送信する応用例です。
マクロファイル内に平文でパスワードをハードコードするのはセキュリティ上のリスクがあるため、ここでも /ask4passwd オプション(または passwordbox コマンド)を用いて、パスワードは実行時に入力させる形にしています。
; ==========================================================; 動的コマンド実行マクロ; ==========================================================
; 事前接続処理(パスワードは実行時にポップアップで入力)connect '192.168.1.50:22 /2 /ssh /auth=password /user=admin /ask4passwd'if result != 2 then messagebox 'サーバーへの接続に失敗しました。' '接続エラー' endendif
; 接続プロンプトを待機(タイムアウト30秒)timeout = 30wait '$'if result = 0 then messagebox '接続後のプロンプトを確認できませんでした。' 'タイムアウト' endendif
; 実行するコマンドをユーザーに入力させるinputbox 'サーバー上で実行するコマンドを入力してください:' 'リモートコマンド実行'
; 入力値が空(未入力でOKが押された場合)は処理を中断するstrcompare inputstr ''if result = 0 then messagebox 'コマンドが入力されなかったため、マクロを終了します。' '中断' endendif
; 入力されたコマンドを独自変数に退避run_command = inputstr
; コマンドラインに送信sendln run_command
; 実行結果を待機wait '$'if result = 0 then messagebox 'コマンド実行後のプロンプトを確認できませんでした。' 'タイムアウト' endendif
messagebox 'コマンドの送信が完了しました。' '完了'[!WARNING] 任意のコマンドを実行させる際の注意点 入力した文字列は、そのまま接続先サーバーのシェルに送信されます。誤ったコマンドを入力すると、意図しないファイルの削除や設定変更などにつながる可能性があるため、実行前に入力内容を十分に確認してください。また、本サンプルは任意のコマンドを実行できるため、利用者や接続先ユーザーの権限を適切に制限して運用してください。
※また、wait '$' で待機するプロンプト記号($ や #、> など)は、接続先ユーザーの権限やシェル環境によって異なります。接続先の環境に合わせて変更してください。システム変数 timeout と mtimeout が両方とも 0 以下の場合、タイムアウトが発生せず無限に待機する可能性があります。待機処理を実装する際は、少なくともどちらか一方に正の値を設定しておきましょう。
なお、wait は指定した文字列を受信した時点で処理を進めるため、実行コマンドのエコーバック(例: echo '$HOME')や出力結果に同じ文字列が含まれる場合、コマンドの実行完了前に一致して次の処理へ進む可能性があります。実運用では、接続先のプロンプトをより識別しやすい文字列に変更して指定するなどの対策を検討してください。
inputbox利用時の注意点とエラー対策
ユーザーの自由な入力を受け付ける性質上、仕様の理解や未入力状態への対策(エラーハンドリング)を実装しておくことが重要です。
事前確認や中断を行いたい場合の対策(yesnoboxの併用)
前述の通り、inputbox は入力文字列を inputstr に格納するコマンドであり、通常の戻り値として result を利用する仕様ではありません。また、Tera Term 5.3の実機では inputbox ダイアログに「OK」ボタンのみが表示され、ダイアログ単体でのキャンセル操作ができません。
もし処理の開始前やコマンド送信前にユーザーがキャンセル(中断)を選択できるようにしたい場合は、yesnobox コマンドを組み合わせて確認ダイアログを表示するのが有効です。yesnobox は「はい」が押されるとシステム変数 result に 1、「いいえ」が押されると 0 を格納します。
; 事前に yesnobox で実行可否を確認するyesnobox 'ホストへの接続処理を開始しますか?' '実行確認'
; 「いいえ」(result = 0)が選択された場合は中断if result = 0 then messagebox '処理がキャンセルされました。' '中断' endendif
; 「はい」(result = 1)の場合のみ inputbox を表示inputbox '接続先のIPアドレスを入力してください:' 'ホスト接続'入力値が空(ブランク)の場合のバリデーション
何も文字を入力せずに「OK」ボタンが押された場合、inputstr は空文字列('')になります。これをそのまま後続のコマンドに渡してしまうと、接続先不明や意図しない空改行送信などの原因になります。
strcompare コマンド(または文字列長を取得する strlen コマンド)を用いて、値が入力されているかを検証するバリデーションを必ず組み込んでください。また、以下のようにラベル(:input_loop)と goto を使うことで、値が入力されるまで再入力を促すことも可能です。
:input_loopinputbox 'ユーザー名を入力してください:' '認証設定'
; 変数 inputstr と空文字 '' を比較するstrcompare inputstr ''if result = 0 then ; resultが0の場合は一致(=空文字である)と判定し、再入力を促す messagebox '入力が空です。値を入力してください。' 'エラー' goto input_loopendif
; 入力された値を退避して後続処理へ進むlogin_user = inputstrまとめ
この記事では、Tera Termマクロで inputbox コマンドを使用して動的なユーザー入力を受け取る方法について解説しました。
inputboxを利用することで、ダイアログボックスを介して対話的な入力を受け取ることができ、第3引数で初期値を指定することも可能である。- 入力された文字列はシステム変数
inputstrに格納される。他のコマンドで上書きされるのを防ぐため、取得後は独自変数に退避するのが安全である。 - パスワードを扱う場合は平文のハードコードや
inputboxを避け、マスク表示されるpasswordboxやconnectの/ask4passwdオプションを利用する。 - 安全に運用するため、
strcompareによる空文字バリデーション、yesnoboxによる実行確認、wait実行時のtimeout設定を組み込むことが重要である。
環境が変わるたびにスクリプトを書き換える必要をなくし、効率的でメンテナンス性の高いTera Termマクロを作成するために、ぜひ inputbox の活用を検討してみてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。