我正在给veracryp加油,并且需要以非交互模式运行安装脚本。要运行脚本,如果以交互方式运行,我需要传递脚本要求的答案。问题是如果我通过命令管道传递答案或从文件中传递答案,我会得到错误:
echo -e "1\n\nq\ny\ny\n\n" | /opt/tdp/veracrypt-1.23-setup-console-x64
Verifying archive integrity... 100%
All good. Uncompressing VeraCrypt 1.23 Installer 100%
Error: Terminal required
如果我运行相同的脚本但没有管道,则该脚本可以正常运行。
我将问题缩小到这一行
问题在于,取决于脚本是通过管道运行还是由其自身运行,此行代码的评估方式不同:
tty >/dev/null 2>/dev/null && TTY=1
为了解决这个问题,我创建了这个虚拟笔迹
A=0
tty >/dev/null 2>/dev/null && A=1
echo "A is"
echo $A
echo
如果将此脚本命名为inst.sh并运行两次,无论是否使用管道,您都会得到不同的结果
# echo xxx | ./inst.sh
A is
0
# ./inst.sh
A is
1
知道为什么吗?这可以帮助我解决veracript问题(我无法更改veracript安装脚本)
非常感谢
答案 0 :(得分:0)
我已经使用expect(根据脚本与其他交互式程序“对话”的程序)完成了这种自动化操作
如果不存在,则需要将其安装在docker映像中。
您将需要创建一个带有每个问题提示和答案的期望脚本。
在install-vera-crypt.exp
文件中:
#!/usr/bin/expect -f
set timeout -1
spawn /opt/tdp/veracrypt-1.23-setup-console-x64
expect "The text you expect to answer 1\r"
send -- "1\r"
expect "The text you expect to answer q\r"
send -- "q\r"
...
expect eof
然后您可以执行以下操作:expect -f install-vera-crypt.exp
答案 1 :(得分:0)
Gonzalo Matheu已成功回答了这个问题,非常感谢。我只是在这里发布了对我有用的文件的稍作改动的版本
period