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
という名前で保存します。
#!/usr/bin/expect
set timeout -1
set ssh_password "your_ssh_password"
set su_password "your_su_password"
spawn ssh user_name@your_hostname
expect "password:"
send "$ssh_password\r"
expect "$ "
send "su - root\r"
expect "Password:"
send "$su_password\r"
expect "# "
send "cd /home/user_name\r"
interact
このスクリプト内の expect "Password:"
は文字列一致なので注意してください。例えばプロンプトが日本語にローカライズドされている時は
expect "パスワード:"
と変更する必要があるかもしれません。
スクリプトに実行権限を与えます。
chmod +x ssh_su.sh
スクリプトを実行します。
./ssh_su.sh
このスクリプトを実行すると、ssh
接続後に自動的に
su - root
に切り替わり、指定のディレクトリに移動します。
関連記事
- GhostScript でPDFの圧縮|シェル
- macOSのターミナルでCSV表示
- awkと向き合う
- Automatorを使って独自ショートカットキーを作る|AppleScript x シェルスクリプト
- macOS で Postfix(SMTPメールサーバー)を起動するまで