Скрипт установки veracript завершится неудачно, если запустить из скрипта - PullRequest
1 голос
/ 04 октября 2019

Я dokerising veracryp и мне нужно запустить скрипт установки в неинтерактивном режиме. Для запуска скрипта мне нужно передать ему ответы, которые запрашивает скрипт, если он запущен в интерактивном режиме. проблема заключается в том, что если я передаю ответ по команде piping или из файла, я получаю сообщение об ошибке:

    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 и запустите его дважды, с и без pipe вы получите разные результаты

# echo xxx | ./inst.sh
A is
0

# ./inst.sh
A is
1

Есть идеи почему? Это может помочь мне решить проблему с veracript (я не могу изменить скрипт установки veracript)

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Гонсало Матеу успешно ответил на вопрос, большое спасибо. Я просто выкладываю сюда слегка измененную версию файла, которая у меня работала

#!/usr/bin/expect -f

set timeout -1
spawn /opt/tdp/veracrypt-1.23-setup-console-x64
expect "To select, enter 1 or 2:"
send -- "1\r"
expect "Press Enter to display the license terms..."
send -- "\r"
expect ":"
send -- "q\r"
expect "Do you accept and agree to be bound by the license terms?"
send -- "yes\r"
expect "Press Enter to exit..."
send -- "\r"
expect eof
0 голосов
/ 04 октября 2019

Я сделал этот вид автоматизации, используя ожидайте (это программа, которая «общается» с другими интерактивными программами в соответствии со сценарием)

Вам нужно будет установить ее в докеризображение, если оно отсутствует.

Вам потребуется создать сценарий ожидания с подсказками и ответами на каждый вопрос.

В файле 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...