Назад | Перейти на главную страницу

запустите несколько сценариев bash с ожидаемым кодом и оставьте их запущенными

У меня есть несколько сценариев bash, которые будут выполнять некоторые действия, требующие ввода данных пользователем, поэтому я использую с ним expect.

Однако мне нужен один, чтобы продолжать работать. Но если я использую expect, команда expect будет ждать, пока выполняется скрипт, и мой основной скрипт не продолжится.

IE: script1 порождает сценарий как root:

#!/bin/bash
expect << EOF
spawn su root -c "/bin/bash script2.sh"
expect "Password:"
send "test\n"
set timeout -1
expect eof;
EOF

script2.sh создаст экран:

#!/bin/bash
screen -dm nastyscript.sh

nastyscript.sh создаст двоичный файл, который должен продолжать работать:

#!/bin/bash
expect << EOF
spawn mybinary
expect "*Enter password for my binary"
send "test\r"
expect "*I am running"
set timeout -1
expect -re . { exp_continue } eof { exit }
expect eof;
EOF

Но поскольку один сценарий ожидает завершения, мой основной сценарий не будет продолжаться.

Как это сделать?

Во-первых, вы совершенно не хотите отправлять пароль с ожиданием. Помимо того, что это очень плохой стиль, он полностью подрывает безопасность вашей системы, потому что вы должны хранить пароль пользователя в открытом виде. И все в наши дни знают наизусть, что никогда не следует хранить пароли в открытом виде.

Я бы порекомендовал прочитать справочную страницу для sudoers. Затем вы можете использовать sudo из сценария без необходимости хранить пароли в открытом виде. Более надежным решением, вероятно, был бы исполняемый файл с suid root. В сценариях оболочки нельзя использовать suid по соображениям безопасности, поэтому для этого потребуется компиляция небольшой программы.

С другой стороны, если вы уверены, что вам нужно, чтобы несколько процессов, работающих параллельно, обменивались данными друг с другом, то bash версии 4 предлагает решение в виде coproc ключевое слово. В основном вы кладете coproc перед командной строкой. Для простых команд он действует примерно так же, как & в конце командной строки; процесс будет выполняться параллельно с вашим скриптом. Разница в том, что с coproc у тебя есть stdout и stdin файловые дескрипторы другого процесса, доступные в массиве COPROC, чтобы ваш сценарий мог взаимодействовать с другим процессом. Видеть http://www.gnu.org/software/bash/manual/html_node/Coprocesses.html

Тогда вы также можете захотеть wait в другом процессе до выхода из вашего скрипта.