需要從檔案和 tty 重定向輸入

需要從檔案和 tty 重定向輸入

我正在運行 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__

相關內容