expectは対話式で処理(ssh,telnet接続等)する場合は便利ですが、何故かループ処理の例がウェブに殆どないようなので
拙いながら、一応載せておきます。
とはいえ、条件式でループ処理等の場合は参考になるサイトがありますので
ここでは、リストの値をループ処理する場合になります。
リスト値・・・・・・AAA BBB CCC DDD
リストファイル・・・touch_list(内容はAAA BBB CCC DDD)
■リストした値を順次変数に代入してループ処理する場合
▲shの場合
#!/bin/bash for i in AAA BBB CCC DDD; do touch /tmp/$i done
▲expectの場合
#!/usr/bin/expect foreach i {AAA BBB CCC DDD} { spawn touch /tmp/$i expect "root" }
■リストファイルの値を順次変数に代入してループ処理する場合
▲shの場合
#!/bin/bash TOUCH_LIST=/root/touch_list while read line; do touch /tmp/$line done <$TOUCH_LIST
▲expectの場合
知らん。が、shと組み合わせると以下の通り
#!/bin/bash TOUCH_LIST=/root/touch_list while read line; do expect -c " spawn touch /tmp/$line expect "#" " done <$TOUCH_LIST
■上記4つの実行結果(共通)
# ./test
# ls -l /tmp/
合計 4
-rw-r--r-- 1 root root 0 12月 10 19:39 AAA
-rw-r--r-- 1 root root 0 12月 10 19:39 BBB
-rw-r--r-- 1 root root 0 12月 10 19:39 CCC
-rw-r--r-- 1 root root 0 12月 10 19:39 DDD
======================================================
これだけだと手抜きなので、下記にVMware ESXiホストで動作しているゲストOSのバックアップスクリプトを載せておきます。
方法の解説については別サイトで詳しく解説されておりますので、そちらをご参照下さい。
なお、ESXiサーバへはrootユーザでSSH接続出来たり、バックアップ先をマウントしていることを前提としていますので
未設定の場合は適宜書き換えるか別サイトを参考に設定しておいて下さい。
#!/usr/bin/expect set timeout -1 #下記コマンドを実行して、ESXiホストで動作しているゲストOSを調べます #vim-cmd vmsvc/getallvms #Vmid Name #10 GustOS1 #HTTP Server #12 GustOS2 #MySQL Server #17 GustOS3 #MAIL Server #24 GustOS4 #Active Directory Server #33 GustOS5 #CIFS Server set NOW_TIME [clock format [clock seconds] -format {%Y%m%d}] #ESXiホストへのSSH接続パスワード set PASSWD "Password" #ゲストOSが格納されているデータストア set DATASTORE "/vmfs/volumes/LOCAL" #ゲストOSのバックアップ先 set BACKUPDIR "/vmfs/volumes/BACKUP/$NOW_TIME" set SNAPSHOTCRE "vim-cmd vmsvc/snapshot.create" set SNAPSHOTRM "vim-cmd vmsvc/snapshot.removeall" #VMware ESXiサーバへSSH接続 #ESXiホスト名(IPアドレス)に適宜書き換える spawn ssh VMWARE-ESXI expect "Password" send "$PASSWD\r" expect "#" #バックアップディレクトリを作成 send "mkdir $BACKUPDIR\r" expect "#" #各ゲストOSの構成ファイル(vmx vmxf vmsd)をコピー(バックアップ) foreach i {vmx vmxf vmsd} { send "cp $DATASTORE/*/*.$i $BACKUPDIR/\r" expect "#" } #スナップショットを取得 # VMIDは環境によって適宜変更する foreach VMID {10 12 17 24 33} { send "$SNAPSHOTCRE $VMID $NOW_TIME\r" expect "#" } #スナップショットタスクが完了するまで待機 #事前に手動で下記コマンドを実行し、待機に必要な時間を確認しておく #vim-cmd vmsvc/get.tasklist 確認するゲストOSのVMID sleep 300 #各ゲストOSの本体ファイル(vmdk)をコピー(バックアップ) #ゲストOS名は環境によって適宜変更する foreach VMNAME {GustOS1 GustOS2 GustOS3 GustOS4 GustOS5} { send "vmkfstools -i $DATASTORE/$VMNAME/$VMNAME.vmdk -d thin $BACKUPDIR/$VMNAME.vmdk\r" expect "#" } #スナップショットを削除 # VMIDは環境によって適宜変更する foreach VMID {10 12 17 24 33} { send "$SNAPSHOTRM $VMID\r" expect "#" } #バックアップを完了 send "exit\r"
==================================
動作環境:VMware ESXi5.1