
私はバックアップに Amanda を使用しています。さまざまな日付のファイルを大量に復元する必要があります。ファイルの名前は同じなので、復元セッションを複数回実行する必要があります。そこで、スクリプトを作成しようと考えました。これが私のスクリプトです。
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 のマニュアルページを見て、また、誰かがこの問題を解決していないか Google で検索してみました。また、コードはコンパイルされているので、確認を待たないようにスクリプトをハックすることはできません。
スクリプトから入力を取得し、/dev/tty を stdin にリダイレクトする方法はありますか?
答え1
amrecover
は対話型スクリプトとして設計されているため、これを自動化するには従来どおり を使用しますexpect
。このtcl
ユーティリティは、会話で 2 種類のプロンプト (amrecover>
およびContinue? [Y/n]:
) をチェックし、それぞれに異なる応答をするように作成できます。たとえば、myrecover
PATH にファイルを作成し、それを実行可能 ( 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>
プロンプトが表示されたら、スクリプトの stdin から 1 行expect
(つまりコマンド セット) を読み取り、(ファイルの終わりに達していない場合は) その行を改行 (\r
に変換) とともにプログラムに送信します。 は、exp_continue
次のプロンプトの一致のためにコマンドを再度ループさせます。ファイルの終わりに達すると、プログラムへの接続を閉じて、プログラムが終了するのを待ちます。
この方法で実行するamanda
と、続行プロンプトが何らかの例外的な条件などによるものである場合に大混乱が発生する可能性があることに注意してください。
答え2
extract
次のようにユーティリティに入力を提供しますheredoc
。
extract - <<\__DATA__
Y
__DATA__