expectで、対話型のコマンドライン操作を自動化する【シェル・macOS】
expectとは
expect は、対話型のコマンドライン操作を自動化するためのツールおよびスクリプト言語です。特に、SSH接続やパスワード入力など、標準的な自動化ツールでは対処しにくい、対話型の操作が必要な場面で使用されます。具体的には、次のような動作を行うことができます。
対話型プロセスの自動化
コマンドを実行し、その結果を監視して特定のキーワード(例: "password:")が表示されたときに、事前に指定した入力(例: パスワード)を送信することができます。
タイミングを考慮した自動操作
SSH接続やその他の対話型セッションのステップに応じて、適切なタイミングで次のコマンドや入力を送信します。
人の手で行う操作のスクリプト化
対話型のCLI(コマンドラインインターフェース)操作をスクリプト化することで、繰り返し作業を効率化できます。
expect は、通常のシェルスクリプトでは対応が難しい、ユーザーの入力を待つプログラム(SSH、su、passwd など)に対して自動的に操作を行うのに非常に便利です。主な用途
- SSHやsuなどのパスワード入力を自動化
- 対話型インストーラーや設定プロセスの自動化
- テストの自動化(対話型のプログラムをテストする際)
セキュリティ上の観点から、パスワードをスクリプト内に含めることはリスクがあるため、その運用には十分注意が必要です。
ssh 接続と su - root のパスワード入力を自動化し、ログイン後のシェル操作を一発でやる
以下のようにスクリプトを作成して、ssh 接続と su - root のパスワード入力を自動化することが可能です。ただし、su コマンドのパスワードを自動化することはセキュリティリスクがあるため、慎重に運用する必要があります。
まずは expect コマンドを利用して、自動化を行うスクリプトを作成します。
expect がインストールされているか確認し、必要に応じてインストールしてください(macOSの場合はbrew install expect)。スクリプト例
以下のスクリプトを作成して、ssh_su.sh という名前で保存します。
bash
#!/usr/bin/expect
set timeout -1
set ssh_password "your_ssh_password"
set su_password "your_su_password"
# SSH 接続
spawn ssh user_name@your_hostname
expect "password:"
send "$ssh_password\r"
# su - root 実行
expect "$ "
send "su - root\r"
expect "Password:"
send "$su_password\r"
# ディレクトリ移動
expect "# "
send "cd /home/user_name\r"
# インタラクティブモードに移行
interact
このスクリプト内の expect "Password:" は文字列一致なので注意してください。例えばプロンプトが日本語にローカライズドされている時は expect "パスワード:" と変更する必要があるかもしれません。
スクリプトに実行権限を与えます。
bash
chmod +x ssh_su.sh
スクリプトを実行します。
bash
./ssh_su.sh
このスクリプトを実行すると、ssh 接続後に自動的に su - root に切り替わり、指定のディレクトリに移動します。
関連記事
アイデアノート > macOSで使えるシェル