ошибка, возникающая при использовании su -c: bash: в этой оболочке нет управления заданиями

ошибка, возникающая при использовании su -c: bash: в этой оболочке нет управления заданиями

Я написал скрипт, который должен выполнять определенные команды от имени другого пользователя и после завершения выполнения (успешного или неудачного) немедленно выходить из системы.

Я читал, что могу использовать -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

Связанный контент