Как избежать потери оболочки с помощью set -e

(Альтернатива мой ответ ). Программы, ожидающие взаимодействия с пользователем на / dev / tty, а не просто чтение stdin, могут обрабатываться командой expect , которая использует язык tcl . Например, предполагая, что вы ожидаете в / usr / bin / expect, создайте файл setuserpw , содержащий это:

#!/usr/bin/expect -f
expect_user -re "(\[^ \]+) (\[^ \]+)\n"
set user $expect_out(1,string)
set pw   $expect_out(2,string)
spawn passwd $user
expect "password:"
send "$pw\r"
expect "password:"
send "$pw\r"
expect eof

и не забудьте сделать его исполняемым

chmod +x ./setuserpw

Сценарий читает stdin для двух слов в строке и устанавливает для них переменные user и pw . Затем он запускает (порождает) программу passwd для пользователя, подключаясь через псевдотерминал (см. man pty ). Он читает свой вывод для подсказки , соответствующей "password:". Затем он отправляет пароль программе, и делает то же самое снова (при условии, что программа запрашивает пароль дважды). Например:

./setuserpw <

В вашем случае замените passwd от slappasswd и убедитесь, что получаемые вами подсказки соответствуют тем, что в этом примере.

-3
23.05.2018, 21:16
3 ответа

¿Quiere decir que su shell interactivo sale?

Si obtiene un script (con.)que establece set -edesde su shell interactivo, el indicador "salir -en el error -" también se establecerá en su shell interactivo. Si lo ha hecho antes, se aplicará a cualquier comando que ejecute después, ya sea un script de origen(../script.sh)o uno iniciado normalmente(./script.sh).

La solución es no generar scripts que set -e.

Es posible que también desee ver BashFAQ 105 sobre otros problemas con set -e.

4
28.01.2020, 05:18

Si desea tener set -een un shell interactivo y desea ejecutar un comando que puede devolver un valor distinto de cero, debe capturar ese código de salida. Un método:

$ some_command || :

Otro:

$ if ! some_command; then :; fi
0
28.01.2020, 05:18

Si alguna vez llamó a set -een su shell de inicio de sesión y luego ejecutó un comando que devuelve un código de salida que no es cero -que no se usa en una declaración compuesta, entonces su shell de inicio de sesión saldrá:

set -e
false

cerrará su sesión.

Si alguna vez ejecutó un script que incluye set -eusando ../script, configuró -een su shell de inicio de sesión.

Si luego ejecuta cualquier comando con código de salida distinto de cero :bingo.

0
28.01.2020, 05:18

Теги

Похожие вопросы