Запуск интерактивной скрипта оболочки во имя другого пользователя

StackOverflow https://stackoverflow.com/questions/3628695

  •  26-09-2019
  •  | 
  •  

Вопрос

В моем скрипте оболочки (Bash) я хочу позвонить другим сценариям оболочки.
Я бегу свой скрипт как user_a. Один из этих скриптов нуждается в специальной обработке:

  1. Он должен быть запущен как другой пользователь (user_b). Пароль необходим здесь.
  2. Он интерактивный, но не только спрашивает вопросы, но запускает другой скрипт в имени другого пользователя (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. Отказ Это разработано для сценариев взаимодействия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top