対話式コマンドを自動化
expectは対話式のコマンドを自動化してくれるそうな。
fdiskを使った例をあげていく。
引数にファイル名を渡し実行する。
expect ファイル名
これで勝手に進めてくれる。
ファイルにはTcl(Tool Command Languageというらいし)で処理を書く。
まず最初はこれ↓(おまじないです)
#! /usr/bin/expect -f
この後にTclで処理を書いていく。
spawn fdisk /dev/sdb
spawnはコマンドを実行する。
上記ではfdiskを引数/dev/sdbで実行することになる。
この後にfdiskをどのように処理するかを書いていく。
expect "Command (m for help):" {send "p\n"}
expectは指定した文字列が含まれるとき、処理をさせたり出来る。
上記では「Command (m for help):」という文字列が含まれるとき、「p」を送る。
そうすると、パーティション一覧が出力される。
sendの部分を「n」に変えればパーティションを作成したりも出来る。
実際に、パーティションの削除から作成までをする場合はこんな感じ。
spawn fdisk /dev/sdb # 既存のパーティションを削除 expect "Command (m for help):" {send "p\n"} expect { -re "/dev/sdb1" {send "d\n"; expect "Partition number" {send "1\n"; send "p\n"}; exp_continue} -re "/dev/sdb2" {send "d\n"; expect "Partition number" {send "2\n"; send "p\n"}; exp_continue} -re "/dev/sdb3" {send "d\n"; expect "Partition number" {send "3\n"; send "p\n"}; exp_continue} -re "/dev/sdb4" {send "d\n"; expect "Partition number" {send "4\n"; send "p\n"}; exp_continue} } # パーティションを作成 expect "Command (m for help):" {send "n\n"} expect "Command action" {send "p\n"} expect "Partition number" {send "1\n"} expect "First cylinder" {send "\n"} expect "Last cylinder" {send "\n"} # 書き込んで終了 expect "Command (m for help):" {send "w\n"} expect eof
ほかにもいろんなコマンドがあるようだが、それはまたいつか。
(やるかどうかはわからんが)