
我正在運行 Amanda 進行備份。我需要恢復一堆不同日期的檔案。這些檔案具有相同的名稱,因此我需要執行多個復原會話。所以,我想我應該編寫這件事的腳本。這是我的腳本:
sethost myhost
setdisk /var
setdate 2017-03-25-01-30-01
cd log/httpd
ls
add ssl_request_log
extract
我使用 shell 重定向運行腳本:
amrecover my_Config < /home/me/thatScript
問題是,一旦 amrecover 看到提煉命令它要求我確認。
Continue? [Y/n]:
將“Y”放在“extract”後面的行中不起作用。 Amrecover 坐在那裡等我輸入“Y”。我想 amrecover 需要來自 tty 的輸入,而不僅僅是來自 stdin 的輸入。
我查看了 amrecover 的手冊頁,也用谷歌搜尋看看是否有人已經解決了這個問題。而且,程式碼已編譯,因此我無法破解腳本而不等待確認。
有沒有辦法從腳本獲取輸入並將 /dev/tty 重定向到標準輸入?
答案1
amrecover
旨在成為一個互動式腳本,因此傳統上要使其自動化,您可以使用expect
.該tcl
實用程式可以檢查對話中是否有兩種類型的提示(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 連接到它,然後偵聽輸入以查找兩個提示。當看到通常的amrecover>
提示時,我們從腳本的標準輸入中讀取一行expect
,即您的命令集,並且(如果我們沒有得到文件結尾)將該行發送到程序,並帶有換行符(\r
被轉換對此)。這exp_continue
使得命令再次循環以匹配下一個提示符。在文件末尾,我們關閉與程式的連接並等待它退出。
amanda
請注意,如果繼續提示是針對某些異常情況等,則以這種方式運行可能會造成嚴重破壞。
答案2
extract
透過如下所示向實用程式提供輸入heredoc
:
extract - <<\__DATA__
Y
__DATA__