需要重定向來自文件和 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 看到extract命令,它就會要求我確認。
Continue? [Y/n]:
將“Y”放在“extract”之後的行中不起作用。Amrecover 坐在那裡等我輸入“Y”。我想 amrecover 想要來自 tty 而不僅僅是來自 stdin 的輸入。
我已經查看了 amrecover 的手冊頁,並且我已經在Google上查看是否有人已經解決了這個問題。而且,程式碼已編譯,因此我無法破解腳本而不等待確認。
有沒有辦法從腳本中獲取輸入並將 /dev/tty 重定向到標準輸入?
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
如果繼續提示是針對某些異常情況等,則以這種方式執行可能會造成嚴重破壞。