前回の作業で、自宅仮想環境のLinuxマシンに、ホスト名(マシン名)指定で接続できるように設定しました。今回は、それに続けてより会社LAN環境っぽく、ホスト名接続で自動ログインする、Teraterm(TTL)マクロについて検討しました。
TTLマクロの動作環境
自宅のPC環境は、前回から変わっていません。その他、TTLマクロの動作環境は以下の通り。
- TeraTermバージョン:Ver.4.100
- .ttlファイルは「Tera Term Macro Interpreter」に関連付け済み
- ログイン対象の仮想Linuxマシンへ通信の到達性確立済み
ログインTTLマクロでしたい事
以上を踏まえて、ログインTTLマクロで自動化したい事をまとめました。
- 仮想Linuxマシンのホスト名を指定して接続
- パスワードはパスワードファイルから取得
- ログイン後、管理者権限に移行
作成したログインTTLマクロ
以上を踏まえて、以下の様なログインTTLマクロ(ssh2_login_hostname.ttl)を作成しました。
コマンド説明
「接続情報」取得
以下冒頭の記述で、必要な接続情報を集めています。各変数の対応は、接続先ホスト名(HOSTNAME)、ユーザ名(USERNAME)、パスワード(PASSWD)、パスワードファイルパス(PASSFILE)となっています。パスワード(PASSWD)は、適当な値(ここでは’everyone’)で、
;=======================================================
; 接続情報:接続先ホスト名/ユーザ名/パスワード
HOSTNAME = 'serv01'
USERNAME = 'yoshino'
PASSWD = 'everyone'
;暗号化ファイルパス
PASSFILE = '\\NASNE-57E8BC\share2\pw_file\passwd.dat'
;=======================================================
;暗号化ファイルを参照し、パスワード取得
getpassword PASSFILE USERNAME PASSWD
初期化しておき、実パスワードはパスワードファイルを参照し、取得する構成にしました。パスワードファイル※は、ネットワークフォルダに置き、各端末で共有します。パスワードファイルのパスは、パスワードファイルパス(PASSFILE)に格納しています。
※パスワードファイル(.datファイル):TTLマクロで扱う暗号化ファイル。パスワードは、平文直書きを避けて、別ファイル(図1:passwd.dat)に暗号化して格納される為、安全に扱うことができる。
「getpassword」コマンド
「getpassword」コマンドは、パスワードが暗号化して格納されたパスワードファイルから、平文のパスワードを取り出すTTLコマンドです。「getpassword PASSFILE USERNAME PASSWD」の記述で、フルパス指定のパスワードファイル(PASSFILE)から、ユーザ名(USERNAME)を識別子に、対応したパスワードを復号化して変数(passwd)に格納しています。
接続コマンド組立て
以下の記述で、ここまでで集めた接続情報を、コマンドオプションとして挿し込んで、ログインコマンドを組み立て、接続コマンド(COMMAND)変数に格納しています。
;接続コマンド組立て
COMMAND = HOSTNAME
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWD
「strconcat」コマンド
「strconcat」コマンドは、文字列を連結するTTLコマンドです。接続コマンド(COMMAND)変数には、最終的に以下接続コマンドが格納されます。
COMMAND = 'serv01:22 /ssh /2 /auth=password /user=yoshino /passwd=XXXXXXXX'
- マーカー箇所が、挿し込まれた接続情報
- 「:22」は、22ポート(ssh接続のデフォルト)の使用を示す ※今回は固定値
- 「/ssh /2」は、SSH2による接続を示す
- 「/auth=password」は、パスワード認証の使用を示す
認証方法の指定については、Qiitaの記事「自分がよく使うTeratermマクロによる自動ログインのやり方をまとめてみたよ」に詳しい解説があるので、そちらを参照下さい。
接続
;接続
connect COMMAND
;Wait時のタイムアウト設定(5秒待つ)
timeout=5
「connect」コマンド
「connect」コマンドは、接続コマンドを実行するTTLコマンドです。「connect COMMAND」の記述で、COMMAND変数に格納された、接続コマンドを実行します。
「timeout」コマンド
続いて「timeout」コマンドは、タイムアウト設定を行うTTLコマンドです。「timeout=5」の記述で、以降のWait処理の待ち時間を、最大5秒に制限します。
ログイン時のオプション処理
ログイン時のオプション処理として「wait」コマンドを使い「管理者権限への移行」を実装しました。
;ログイン時のオプション処理
;管理者権限に移行
wait '$'
sendln 'su'
wait ':'
sendln PASSWD
「wait」コマンド
「wait」コマンドは、右記書式「wait <string1> <string2>…<string10>」で記述し、任意の指定文字列(string1~10:最大十個指定)の、どれか一つをホストから取得するか、またはタイムアウト発生まで、マクロを停止するTTLコマンドです。
「sendln」コマンド
「sendln」コマンドは、右記書式「sendln <data1> <data2>…」で記述し、任意の指定文字列(data1~)とそれに続き、改行文字をホストへ送信するTTLコマンドです。
オプション処理:管理者権限への移行
ログイン後「wait ‘$’」→「sendln ‘su’」→「wait ‘:’」→「sendln PASSWD」と、コマンドを送ることで(図2)、管理者権限に移行できます。※但し、rootパスワードは一般ユーザと同じとする。
動作確認
テスト環境の事前準備
作成したログインTTLマクロ(ssh2_login_hostname.ttl)を、任意の場所に配置します(図3)
各端末で共有のパスワードファイルは、適宜、ネットワークフォルダに配置します(図4)
テスト
ログインTTLマクロ(ssh2_login_hostname.ttl)をダブルクリックで起動します。
Teratermが起動してターミナル画面が表示され、仮想サーバにログイン後、管理者権限に移行する事を確認できました(図5)
テスト(初回起動時)
以上テストに続けて、初回時(パスワードファイル未作成時)を想定し、パスワードファイルが無い状態(図6)で、ログインTTLマクロを起動して、動作をチェックします。
ログインTTLマクロ(ssh2_login_hostname.ttl)をダブルクリックで起動します。Teratermが起動し、ユーザ名に対応したパスワード入力を求める、ポップアップ(図7-②)が表示されます。
パスワード入力を求めるポップアップに、パスワードを入力し(図7-③)「OK」ボタンを押します。パスワードが正しければ、ターミナル画面が表示され、仮想サーバにログイン後、管理者権限に移行する事を確認できました(図8)
ログインTTLマクロの動作確認後、パスワードファイルを配置するネットワークフォルダを開き、パスワードファイルが作成される事を確認しました(図9)。
まとめ
今回は、Teratermを使っている以上、避けて通れないTTLマクロを使った、自動ログインについて、検討しました。TTLマクロについては、先達の方々がネット上に沢山の記事をアップされています。それら技術資料を拝読し、多少はセキュリティを意識しつつ、一般的でシンプルなTTLマクロにまとめられたと思います。偉大な先輩方に感謝(≧∀≦人)
会社でのLinux作業は「root」での直接ログインを嫌うが、実作業は管理者権限を取って行うことが多いのが実情です。それを踏まえ、ログイン後のオプション処理として、管理者権限への移行を追加した事が、少しは工夫したところでしょうか。。。
参考文献
- Increments Inc.(2011-)「Qiita」 “自分がよく使うTeratermマクロによる自動ログインのやり方をまとめてみたよ” 2021年6月29日閲覧
- 「teraterm.jp」”パスワードを暗号化して安全なマクロを書く方法” 2021年6月29日閲覧
- Shunsuke Yoshikawa(2014–)「ゼロから始めるTera Termマクロ」”11.1. タイムアウト処理を入れる” 2021年6月29日閲覧
- TeraTerm Project(2004-)「MACRO for Tera Term」”wait” 2021年6月29日閲覧
- TeraTerm Project(2004-)「MACRO for Tera Term」”sendln” 2021年6月29日閲覧
コメント
拝見させていただきました。この記事を参考にログインの自動化を実装するべく試行錯誤しています。
オプション処理:管理者権限への移行の項目で”rootパスワードは一般ユーザと同じとする”とのことですが、別のパスワードを指定する方法はありますでしょうか?
YAMAHAルーターのNVR510では、SSHで接続後の管理者権限への移行は、ログインユーザとは別の管理者パスワードを指定する必要があるためです。
簡単な対応方法としては、管理者パスワードとログインユーザのパスワードを同一とするか、.ttlファイルに記述するかと考えていますが、セキュリティ面や平文での記述はせっかくの暗号化の意味が無くて悩んでいるところです・・・
ご質問ありがとうございます。
ログインユーザとは別の管理者パスワードを指定する方法は、幾つかあると思いますが、
本記事のサンプルコードを拡張する方向で、以下の通り回答いたします。
datファイルは、ユーザ名とパスワードを対で、複数格納する事ができるので、
サンプルコードに、rootユーザとrootパスワードを受ける変数を追加して、
下記のようなコードに拡張しましたので、お試しください。
※参照先のdatファイルが無い状態で起動時、一般ユーザとrootユーザのパスワードを
聞くポップアップが出るので、正しく入力することでdatファイルに登録されます。
;=======================================================
; 接続情報:接続先ホスト名/ユーザ名/パスワード
HOSTNAME = ‘serv01’
USERNAME = ‘yoshino’
PASSWD = ‘everyone’
ADMINNAME = ‘root’
PASSWD2 = ‘everyone’
;暗号化ファイルパス
PASSFILE = ‘\\NASNE-57E8BC\share2\pw_file\passwd.dat’
;=======================================================
;暗号化ファイルを参照し、パスワード取得
getpassword PASSFILE USERNAME PASSWD
getpassword PASSFILE ADMINNAME PASSWD2
;接続コマンド組立て
COMMAND = HOSTNAME
strconcat COMMAND ‘:22 /ssh /2 /auth=password /user=’
strconcat COMMAND USERNAME
strconcat COMMAND ‘ /passwd=’
strconcat COMMAND PASSWD
;接続
connect COMMAND
;Wait時のタイムアウト設定(5秒待つ)
timeout=5
;ログイン時のオプション処理
;管理者権限に移行
wait ‘$’
sendln ‘su’
wait ‘:’
sendln PASSWD2
;マクロ終了
end
突然のコメントにご回答いただきありがとうございました
ご提示いただいたコードを元にttlファイルを作成し、無事目的を達成することができ、
これで毎回の作業がとても楽に・・・
実は質問させていただく前にdatファイルに複数ユーザID&パスワードを格納すべく自前でコードを修正して試していただのですが、失敗し続き、ヘルプをさせていただいた次第でした。
ご提示いただいたコードと比較すると単純に凡ミスでしてお恥ずかしい限り・・・。
何はともあれ大変ありがとうございました!