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 に公開鍵登録の可否を聞かれるので、その表示が出るときと出ないときを場合分けしてます。