如果从脚本

时间:2019-10-04 15:22:25

标签: linux bash

我正在给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

如果我运行相同的脚本但没有管道,则该脚本可以正常运行。

我将问题缩小到这一行

https://github.com/veracrypt/VeraCrypt/blob/a108db7c85248a3b61d0c89c086922332249f518/src/Setup/Linux/veracrypt_install_template.sh#L49

问题在于,取决于脚本是通过管道运行还是由其自身运行,此行代码的评估方式不同:

https://github.com/veracrypt/VeraCrypt/blob/a108db7c85248a3b61d0c89c086922332249f518/src/Setup/Linux/veracrypt_install_template.sh#L23

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安装脚本)

非常感谢

2 个答案:

答案 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