需要从文件和 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__

相关内容