expectで、対話型のコマンドライン操作を自動化する【シェル・macOS】

expectとは

expect は、対話型のコマンドライン操作を自動化するためのツールおよびスクリプト言語です。特に、SSH接続やパスワード入力など、標準的な自動化ツールでは対処しにくい、対話型の操作が必要な場面で使用されます。

具体的には、次のような動作を行うことができます。

対話型プロセスの自動化

コマンドを実行し、その結果を監視して特定のキーワード(例: "password:")が表示されたときに、事前に指定した入力(例: パスワード)を送信することができます。

タイミングを考慮した自動操作

SSH接続やその他の対話型セッションのステップに応じて、適切なタイミングで次のコマンドや入力を送信します。

人の手で行う操作のスクリプト化

対話型のCLI(コマンドラインインターフェース)操作をスクリプト化することで、繰り返し作業を効率化できます。

expect は、通常のシェルスクリプトでは対応が難しい、ユーザーの入力を待つプログラム(SSH、supasswd など)に対して自動的に操作を行うのに非常に便利です。

主な用途

  • 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 に切り替わり、指定のディレクトリに移動します。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム