У меня есть несколько сценариев 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
в другом процессе до выхода из вашего скрипта.