対話式コマンドを自動化

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

ほかにもいろんなコマンドがあるようだが、それはまたいつか。
(やるかどうかはわからんが)