Io-Redirection

需要重定向來自文件和 tty 的輸入

  • May 21, 2017

我正在為我的備份執行 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如果繼續提示是針對某些異常情況等,則以這種方式執行可能會造成嚴重破壞。

引用自:https://unix.stackexchange.com/questions/366325