Запуск скрипта интерактивной оболочки на имя другого пользователя - PullRequest
1 голос
/ 02 сентября 2010

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

  1. Он должен запускаться от имени другого пользователя (user_B).Здесь нужен пароль.
  2. Он интерактивный, но не только задает вопросы, но и запускает другой скрипт на имя другого пользователя (user_C), используя su.Здесь я также должен ввести пароль.

Я могу использовать su, вызывая этот скрипт, но на его вопросы нужно как-то ответить.Я ничего не могу ввести, потому что он печатает для каждого квеста "stty:: не пишущая машинка"

Я так называю специальный скрипт

su user_B << ABC
...
special_script
...
ABC

Ответы [ 5 ]

1 голос
/ 02 сентября 2010
#!/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 пользователя, поэтому теперь добавьте 'if ...' для второго пользователя

1 голос
/ 02 сентября 2010

Еще одна опция для запуска сценариев, как и другие пользователи, - это команда sudo, для удобства чтения ее следует считать «superuser do:»Параметр -u дает информацию об имени пользователя.Итак:

sudo -u user_B special_script

Запрашивает пароль для user_B.У меня никогда не было проблем с запуском интерактивных программ.Вы можете управлять тем, кто может кому судить, с помощью команды visudo.

0 голосов
/ 02 сентября 2010

Вы можете использовать expect. Он предназначен для взаимодействия по сценарию.

0 голосов
/ 02 сентября 2010

su пытается получить пароль от терминала и нуждается в tty-устройстве, чтобы он мог вызвать ioctl, чтобы отключить эхо-сигнал клавиатуры. Поскольку стандартный ввод поступает из «здесь документа» (ABC), попытка вызвать ioctl для файлового дескриптора 0 приводит к «not tty».

Если вам необходимо использовать документ здесь вместо добросовестного сценария, выполните:

cat > /tmp/myscript.$$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$$
sudo -u user_B /tmp/myscript.$$
0 голосов
/ 02 сентября 2010

Вы можете использовать sudo и создать файл sudoers, который позволяет user_A запускать скрипт как user_B.

строка вроде:

user_A      ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC

позволит user_A сделать что-то вроде

sudo -u user_B /usr/share/stuff/ABC

без запроса пароля

...