Я написал скрипт, который должен выполнять определенные команды от имени другого пользователя и после завершения выполнения (успешного или неудачного) немедленно выходить из системы.
Я читал, что могу использовать -c
для su
выполнения команд. Поэтому я написал такой скрипт:
#!/usr/bin/env bash
su - user2 -c "echo 'hurray' && exit"
Он выполняет echo
команду, но остается в системе, так как user2
не выходит из системы. Я даже пробовал использовать logout
вместо , exit
но он остается в системе. Мне нужно выполнить скрипт как , user1
который вызывает su
команду и выполняется как , user2
а затем управление должно вернуться к user1
после завершения.
ОБНОВЛЯТЬ
Хорошо, я мог выйти автоматически, но в этот раз некоторые команды не выполняются. Например:
Команда1:
su user2 -c 'echo 1'
Вывод1:
1
А затем он сам выходит из системы.
Команда2:
su user2 -c 'bash some-script.sh'
Вывод2:
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
Итак, всякий раз, когда я пытаюсь запустить какой-либо скрипт через -c
, su
он выводит указанную выше ошибку. Я пробовал много команд с -c
такими опциями, как ls
, which
, bash --version
, mkdir
, rm
, whoami
и т. д. Все эти команды давали правильный вывод. Но любая команда, которая пытается выполнить скрипт, завершается ошибкой.
su user2 -c 'bash --version' # Works
su user2 -c 'bash some-script.sh' # Doesn't work
Я не могу понять, почему это происходит. И причина, по которой я не могу исправить эту ошибку, тоже.
решение1
Причина такого поведения описана на странице руководства для последних версий su
:
-c, --command КОМАНДА
Укажите команду, которая будет вызвана оболочкой, используя ее
-c
.Выполненная команда будетне имеют управляющего терминала. Эту опцию нельзя использовать для выполнения интерактивных программ, которым требуется управляющий TTY.
(выделено мной)
При запуске базовых команд, таких как ls
, echo
или bash --version
, они просто выводят свой вывод в stdout
поток, без необходимости использования управляющего терминала.
Я подозреваю, что либо способ bash
вызывается (как интерактивная оболочка), либо some-script.sh
содержит команды, которым требуется управляющее терминальное устройство, поэтому при запуске 'bash some-script.sh'
возникает cannot set terminal process group (-1): Inappropriate ioctl for device
ошибка.
Некоторые объяснения
Ауправляющий терминалдля процесса — это терминальное устройство, с которого был запущен процесс. Управляющий терминал может посылать сигналы группам процессов и является механизмом, с помощью которого работает управление заданиями в операционных системах Unix; управление заданиями позволяет процессам в группе процессов выполняться на переднем плане или в фоновом режиме.
Вывод команды ps
показывает управляющий терминал для каждого процесса, например,
$ ps
PID TTY TIME CMD
3614 pts/5 00:00:00 bash
31628 pts/5 00:00:00 ps
Недавнее изменение в su
Раньше su -c
запускал управляющий терминал, когда не запущена интерактивная оболочка. Запуск apt-get changelog login
на моей системе Ubuntu показывает, что удаление управляющего терминала было введено в мае 2012 года в качестве меры безопасности:
- su: Исправлен возможный перехват tty путем отключения управляющего терминала при выполнении команды (CVE-2005-4890). Закрывает: #628843