MB blog

Sharing experience as a former Java developer

expectで対話型シェル


スポンサードリンク

sshやscpなど、対話型のインプットが必要なコマンドを、スクリプト化して運用に使いづらいので、expectパッケージを利用すると便利です。
OSにあらかじめexpectのパッケージが入っていない場合、下記コマンドでインストール。

yum install expect

下記は、リモートホストにログインして ls を叩くシェルのサンプルです。

#!/bin/bash

hostname=192.168.10.12
username=hoge
password=hogehoge

expect -c "
spawn ssh -l oracle $hostname
expect \"$username@$hostname's password:\" {
  send \"$password\n\"
} \"Are you sure you want to continue connecting (yes/no)?\" {
  send \"yes\n\"
  expect \"$username@$hostname's password:\"
  send \"$password\n\"
}

expect \"\[$username@$hostname ~\]$\"
send \"ls\n\"

interact
"

ポイントはこれだけ

  • spawn 最初に投げるコマンド(別プロセスを生成)
  • expect 予想される表示内容(パターンマッチが使える)
  • send 表示内容に対して送りたいコマンド(改行文字を忘れずに。)
  • expect "A" { send "B" } "A'" { send "B'" } と場合分けが可能

このサンプルでは、はじめてssh接続するホストの場合、~/.ssh/known_hosts に公開鍵登録の可否を聞かれるので、その表示が出るときと出ないときを場合分けしてます。