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