ファイルからの入力とttyからの入力をリダイレクトする必要がある

ファイルからの入力とttyからの入力をリダイレクトする必要がある

私はバックアップに 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]:) をチェックし、それぞれに異なる応答をするように作成できます。たとえば、myrecoverPATH にファイルを作成し、それを実行可能 ( 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__

関連情報