(Альтернатива мой ответ ).
Программы, ожидающие взаимодействия с пользователем на / 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
и убедитесь, что получаемые вами
подсказки соответствуют тем, что в этом примере.
¿Quiere decir que su shell interactivo sale?
Si obtiene un script (con.
)que establece set -e
desde 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
.
Si desea tener set -e
en 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
Si alguna vez llamó a set -e
en 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 -e
usando ../script
, configuró -e
en su shell de inicio de sesión.
Si luego ejecuta cualquier comando con código de salida distinto de cero :bingo.