Назад | Перейти на главную страницу

В чем разница между su --command и su --session-command?

Бег # su - oliver --command bash дает оболочку, но также выводит предупреждение bash: no job control in this shell, и действительно Ctrl + Z и fg/bg не работают в этой оболочке.

Бег # su - oliver --session-command bash предоставляет оболочку без вывода предупреждения, и управление заданиями действительно работает.

Предложение использовать --session-command происходит от Запуск оболочки из сценариев с использованием su приводит к "отсутствию управления заданиями в этой оболочке" в котором говорится: «[исправление безопасности для su] изменило поведение опции -c и отключает управление заданиями внутри вызываемой оболочки».

Но я до сих пор этого не совсем понимаю. Когда следует использовать --command и когда следует использовать --session-command? Является --command (он же -c) более безопасный? Или всегда следует использовать --session-command, и --command просто оставлено для обратной совместимости?

FWIW, я использую RHEL 6.4.

Как правило, вы должны предпочесть --command (-c) к --session-command. Вы не должны использовать -c с интерактивными оболочками (возможно, вы хотели --shell /bin/bash ?), но вы должны использовать его с фоновыми процессами.

--session-command не вызывает setsid () для выделения нового сеанса (что, как вы обнаружили, имеет эффект разрешения продолжения использования управляющего tty, и, таким образом, bash предоставит вам управление процессом в виде интерактивной оболочки). Это означает, что его дочерние элементы могут быть назначены любой группе процессов родительского сеанса, возможно, pg переднего плана сеанса или для предотвращения killpg () или другой классификации на основе идентификатора группы процессов. Он также сохраняет возможность отправлять SIGCONT любому процессу в сеансе, хотя я не уверен, насколько это опасно.

Я также обнаружил, что использование -c не создает tty:

# su nobody -s /bin/bash -c "echo hi >/dev/tty"
bash: /dev/tty: No such device or address
#
# su nobody -s /bin/bash --session-command="echo hi >/dev/tty"
hi
#

Учитывая --session-command нет на странице руководства какого-либо крупного дистрибутива, о котором я слышал, скорее всего, это специальная вещь RHEL (Google тоже не помог).

-c делает su выполнить указанную вами команду, используя любую оболочку, определенную в /etc/passwd для указанного пользователя. Это очень похоже на sudo, но как любой пользователь, которого вы выбрали и знаете пароль. -c делает не предоставить интерактивную оболочку, поэтому все, что требует tty, работать не будет.