Запуск интерактивной скрипта оболочки во имя другого пользователя
Вопрос
В моем скрипте оболочки (Bash) я хочу позвонить другим сценариям оболочки.
Я бегу свой скрипт как user_a. Один из этих скриптов нуждается в специальной обработке:
- Он должен быть запущен как другой пользователь (user_b). Пароль необходим здесь.
- Он интерактивный, но не только спрашивает вопросы, но запускает другой скрипт в имени другого пользователя (user_c) с использованием SU. Я должен ввести пароль здесь.
Я могу использовать SU, вызывая этот сценарий, но его вопросы должны быть как-то ответы. Я не могу ввести ничего, потому что он печатает для каждого квеста "STTY :: Не пишущая машинка"
Я так называю специальный скрипт таким образом
su user_B << ABC
...
special_script
...
ABC
Решение
#!/bin/bash
main_for_root(){
:
}
# ------------------------------------------------------------------------------
abs_path="$(readlink -f `dirname $0`)/$(basename $0)"
# if [ `id -u` != 0 ] ; then
if [ `whoami` != 'root' ] ; then
echo "[su -] run as root"
su -c"/bin/bash $abs_path $@"
exit 0
else
main_for_root $@
fi
Работает на 1 пользователь, так что теперь добавьте «Если ...» для второго пользователя
Другие советы
Другой вариант для запуска сценариев как другие пользователи - команда Sudo ', подумайте об этом как «Суперпользователь»: «Для числа читаемости. Параметр -U дает информацию имени пользователя. Так:
sudo -u user_B special_script
Подскажет пароль для пользователя_b. У меня никогда не было проблем с выполнением интерактивных программ, используя его. Вы можете управлять тем, кто может SUDO кому через команду Visudo.
Вы можете использовать sudo и создать файл sudoers, который позволяет user_a запускать скрипт как user_b.
линия, как:
user_A ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC
позволит Usel_a делать что-то вроде
sudo -u user_B /usr/share/stuff/ABC
Не просив пароль
su
попытки получить пароль от терминала и нуждается в устройстве TTY, чтобы он мог позвонить ioctl
Чтобы отключить клавишу эхо. Поскольку стандартный вход происходит из «здесь документа» (ABC), попытка вызвать IOCTL на файловом дескрипторе 0 выдажи «не TTY».
Если вы должны использовать здесь документ вместо добросовестный Сценарий, делайте:
cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$
Вы можете использовать expect
. Отказ Это разработано для сценариев взаимодействия.