私はバックアップのためにアマンダを運営しています。日付が異なる複数のファイルを回復する必要があります。ファイル名は同じであるため、複数の回復セッションを実行する必要があります。それでこの文章を書かなければならないと思いました。これは私のスクリプトです。
sethost myhost
setdisk /var
setdate 2017-03-25-01-30-01
cd log/httpd
ls
add ssl_request_log
extract
シェルリダイレクトを使用してスクリプトを実行します。
amrecover my_Config < /home/me/thatScript
問題は一度amrecoverが見ればタブレットコマンドが私に確認を要求しました。
Continue? [Y/n]:
「extract」の後に「Y」と入力しても効果はありません。 Amrecoverは私が「Y」を入力するのを待っています。 amrecoverにはstdinだけでなくttyの入力も必要です。
私はamrecoverのマニュアルページを見て、誰かがこの問題を解決したかどうかを知るためにグーグルをしました。また、コードがコンパイルされているため、確認を待たないとスクリプトをハックできません。
スクリプトから入力を取得し、/dev/ttyを標準入力にリダイレクトする方法はありますか?
ベストアンサー1
amrecover
これはインタラクティブスクリプトで作成されているため、通常はこれを自動化するために使用しますexpect
。このユーティリティは、2種類のプロンプト(および)tcl
の会話を確認し、さまざまな方法で応答できます。たとえば、PATHにファイルを作成して実行可能にし()、次の内容をその中に入れます。amrecover>
Continue? [Y/n]:
myrecover
chmod +x myrecover
#!/usr/bin/expect
spawn amrecover my_Config
expect -ex {Continue? [Y/n]:} { send "y\r"; exp_continue } \
-ex {amrecover>} { gets stdin input;
if ![eof stdin] { send $input; send "\r"; exp_continue } }
close
wait
次に、次のように実行します。
./myrecover </home/me/thatScript
スクリプトexpect
はコマンドを分岐して実行し、amrecover my_Config
ptyを介してコマンドに接続し、2つのプロンプトへの入力を聞きます。一般的なamrecover>
プロンプトが表示されたら、expect
スクリプトの標準入力、コマンドセットから1行を読み(ファイルの終わりが得られなかった場合)、改行文字(\r
に変換)を使用してその行をプログラムに送信します。これ)。これexp_continue
により、コマンドは次のプロンプトと一致するように再度繰り返されます。ファイルの最後でプログラムへの接続を閉じ、プログラムが終了するのを待ちます。
amanda
このように実行すると、プロンプトが異常な状況などである場合、混乱を招く可能性があります。