【Tera Termマクロ】inputboxの使い方!動的な入力値を受け取る方法

【Tera Termマクロ】inputboxの使い方!動的な入力値を受け取る方法

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:4,133

Tera Termマクロでinputboxコマンドを使って動的なユーザー入力を受け取る方法を解説。ホスト名や実行コマンドを都度入力させることで、柔軟性の高い汎用マクロを作成する手順とサンプルコードを分かりやすく紹介します。

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

ベストセラー

世界一流エンジニアの思考法

難易度
実用性
思考法

技術スキル以上に大切な「考え方」をアップデートできる。世界基準の効率的な仕事術が学べます。

文系社会人のためのIT資格の歩き方: 文系のあなたに最適な道をご提案します (YKcreate kiki)

難易度
実用性
キャリア度

ロードマップが非常に明確。キャリアプランを見据えた、無駄のない学習順序を提案してくれます。

エンジニアを説明上手にする本 相手に応じた技術情報や知識の伝え方

難易度
実用性
コミュ力

「伝える技術」もエンジニアの重要なスキル。相手の視点に立った、具体的な説明のコツが満載です。

技術広報入門 ー テックブログから始めるエンジニアカルチャーのつくり方

難易度
実用性
独自性

テックブログを入口にエンジニア組織の文化をどう設計し、育てていくかという実践論が学べます。

Tera Termマクロ(TTL)を記述している際に、「接続するホスト名やIPIP [アイピー]Internet Protocol。インターネット通信の基本プロトコルアドレスを固定せず、実行するたびに入力させたい」「作業ごとに異なるコマンドを動的に渡せるようにしたい」と悩んだことはありませんか。接続先や処理内容をマクロファイル内に直接書き込んでしまうと、環境が変わるたびにファイルを修正する手間が発生します。

この記事を読むと、inputboxコマンドを利用してダイアログボックス経由で動的なユーザー入力を受け取る方法が分かるようになります。これにより、コードの書き換えが不要な柔軟性の高い汎用マクロを作成できるようになり、日々の業務効率化につながります。

確認した環境

本記事で解説する手順およびサンプルコードは、以下の環境で動作を確認しています。

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アドレスが入力されていません。マクロを終了します。' 'エラー'
end
endif
; 3. 入力された文字列を独自変数に退避する
target_host = inputstr
; 4. 接続コマンドの構築と実行(パスワードは /ask4passwd で実行時に入力)
msg = target_host
strconcat msg ':22 /2 /ssh /auth=password /user=admin /ask4passwd'
; 接続実行
connect msg
if result != 2 then
messagebox 'サーバーへの接続に失敗しました。' '接続エラー'
end
endif
; 5. 接続後の初期コマンド送信例(タイムアウトを30秒に設定)
timeout = 30
wait '$'
if result = 0 then
messagebox '接続後のプロンプトを確認できませんでした。' 'タイムアウト'
end
endif
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 'サーバーへの接続に失敗しました。' '接続エラー'
end
endif
; 接続プロンプトを待機(タイムアウト30秒)
timeout = 30
wait '$'
if result = 0 then
messagebox '接続後のプロンプトを確認できませんでした。' 'タイムアウト'
end
endif
; 実行するコマンドをユーザーに入力させる
inputbox 'サーバー上で実行するコマンドを入力してください:' 'リモートコマンド実行'
; 入力値が空(未入力でOKが押された場合)は処理を中断する
strcompare inputstr ''
if result = 0 then
messagebox 'コマンドが入力されなかったため、マクロを終了します。' '中断'
end
endif
; 入力されたコマンドを独自変数に退避
run_command = inputstr
; コマンドラインに送信
sendln run_command
; 実行結果を待機
wait '$'
if result = 0 then
messagebox 'コマンド実行後のプロンプトを確認できませんでした。' 'タイムアウト'
end
endif
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 '処理がキャンセルされました。' '中断'
end
endif
; 「はい」(result = 1)の場合のみ inputbox を表示
inputbox '接続先のIPアドレスを入力してください:' 'ホスト接続'

入力値が空(ブランク)の場合のバリデーション

何も文字を入力せずに「OK」ボタンが押された場合、inputstr は空文字列('')になります。これをそのまま後続のコマンドに渡してしまうと、接続先不明や意図しない空改行送信などの原因になります。

strcompare コマンド(または文字列長を取得する strlen コマンド)を用いて、値が入力されているかを検証するバリデーションを必ず組み込んでください。また、以下のようにラベル(:input_loop)と goto を使うことで、値が入力されるまで再入力を促すことも可能です。

:input_loop
inputbox 'ユーザー名を入力してください:' '認証設定'
; 変数 inputstr と空文字 '' を比較する
strcompare inputstr ''
if result = 0 then
; resultが0の場合は一致(=空文字である)と判定し、再入力を促す
messagebox '入力が空です。値を入力してください。' 'エラー'
goto input_loop
endif
; 入力された値を退避して後続処理へ進む
login_user = inputstr

まとめ

この記事では、Tera Termマクロで inputbox コマンドを使用して動的なユーザー入力を受け取る方法について解説しました。

  • inputbox を利用することで、ダイアログボックスを介して対話的な入力を受け取ることができ、第3引数で初期値を指定することも可能である。
  • 入力された文字列はシステム変数 inputstr に格納される。他のコマンドで上書きされるのを防ぐため、取得後は独自変数に退避するのが安全である。
  • パスワードを扱う場合は平文のハードコードや inputbox を避け、マスク表示される passwordbox や connect の /ask4passwd オプションを利用する。
  • 安全に運用するため、strcompare による空文字バリデーション、yesnobox による実行確認、wait 実行時の timeout 設定を組み込むことが重要である。

環境が変わるたびにスクリプトを書き換える必要をなくし、効率的でメンテナンス性の高いTera Termマクロを作成するために、ぜひ inputbox の活用を検討してみてください。


以上で本記事の解説を終わります。
よいITライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

人気記事


記事を評価

Thanks!
目次
Scroll to Top