Запустить несколько скриптов bash с ожидаемым кодом и оставить их работающими
У меня есть несколько сценариев bash, которые будут выполнять некоторые действия, требующие пользовательского ввода, поэтому я использую функцию ожидаемо.
Тем не менее, мне нужно, чтобы продолжать работать. Но если я использую функцию ожидаем, команда ожидают, пока скрипт работает, и мой основной сценарий не будет продолжен.
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
Но, поскольку один сценарий ожидает завершения, мой основной сценарий не будет продолжен.
Есть ли способ сделать это?
1 ответ
Во-первых, вы абсолютно не хотите отправлять пароль с ожиданием. Помимо того, что это очень плохой стиль, он полностью подрывает безопасность вашей системы, потому что вы должны хранить пароль пользователя в открытом тексте. И все в наше время знают наизусть, что вы никогда не должны хранить пароли в открытом виде.
Я бы порекомендовал прочитать на странице руководства 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
на другом процессе, прежде чем ваш скрипт завершится.