fdisk のパーティション作成処理を自動化する

仕事で /dev/sda5 から /dev/sda15 まで 1 GB のパーティションを用意するテスト項目があったので Expect を使って自動化してみた。最初 for 文の書き方がわからなかったのだけれど Expect のホームページ の「Obtaining the examples」を見て less `which mkpasswd` して解決した。

スクリプトのポイントは以下の 2 つ。

  • - パーティション作成処理の最後は「Last cylinder」で判断して exp_continue せず次のループに飛ばす。
  • - 作成後に「w」でテーブルを更新するために expect ループをふたつ用意する。
#!/bin/sh

LANG=C
num=`fdisk -l /dev/sda | grep -e '^/dev/' | wc -l`
if [ $num -lt 4 ]; then
	echo "ERROR: Seems like you don't have extend partition. Create it and try again."	
	exit 2
fi

expect -c '
spawn fdisk /dev/sda 
for {set i 5} {$i<16} {incr i} {
        expect {
                "Command*" {
                        send "n\r"
                        exp_continue
                }
                "First cylinder*" {
                        send "\r"
                        exp_continue
                }
                "Last cylinder*" {
                        send "+1024M\r"
                }
        }
}

expect {
	"Command*" {
		send "w\r"
		sleep 10
		exit	
	}
}
'
exit 0

mkpasswd 以外にもサンプルはけっこうあるので、これからも困ったらこれらのコマンドを見ようと思う。ψ(。。)

$ rpm -ql expect | \grep bin
/usr/bin/autoexpect
/usr/bin/dislocate
/usr/bin/expect
/usr/bin/ftp-rfc
/usr/bin/kibitz
/usr/bin/lpunlock
/usr/bin/mkpasswd
/usr/bin/passmass
/usr/bin/rftp
/usr/bin/rlogin-cwd
/usr/bin/timed-read
/usr/bin/timed-run
/usr/bin/unbuffer
/usr/bin/weather
/usr/bin/xkibitz

Expect は「対話的な処理を自動化する」ちょっと特殊な言語だが、ここぞというところで威力を発揮するので覚えておいて損はないと思う。個人的には、こういったニッチな要求を満たす言語ってなんだか可愛くて大好き。(^-^) もちろん Perl でも Ruby でもモジュールがあるんだろうけど。

追記:
そういえば日本語で書かれた Expect 本ってないのかな。数年前に購入した以下のオライリー本もまだ訳されていないようだし。いい本だしもっと評価されてもいいと思うんだけれど。ヾ(゚0゚*)ノ

Exploring Expect: A Tcl-based Toolkit for Automating Interactive Programs (Nutshell Handbooks)

Exploring Expect: A Tcl-based Toolkit for Automating Interactive Programs (Nutshell Handbooks)