«Невозможно установить группу процессов терминала» во время su другому пользователю в качестве оболочки входа

16

Примечание. Пожалуйста, прочитайте обновленную информацию, начиная с «РЕДАКТИРОВАТЬ», около середины этого поста - среда и фон этой проблемы изменились

У меня установлена ​​стандартная версия Debian 6.0, которую я решил перенести в репозитории Debian Testing. Я сделал это, обменяв ссылки на репозитории Squeeze в моем sources.list, чтобы использовать репозитории Testing.

После установки пакета и перезагрузки я получаю следующую ошибку при попытке su - другому пользователю:

root@skaia:~# su joebloggs -
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

Если я опущу -, это не происходит.

Обратите внимание, что пользователи могут стать пользователем root правильно, это происходит только при переключении с root на кого-то другого и использовании -, чтобы получить среду этого пользователя.

Гугл здесь в основном бесполезен. Единственное, что я могу найти, это ссылки с 2011 года в отношении suxпакета, которые, кажется, были исправлены в то же время.

Это выглядит и пахнет очень похоже на ошибку обновления, исправляемую путем правильной настройки нужного пакета. Я просто понятия не имею, с чего начать - кроме этого, моя система работает полностью нормально и, как и ожидалось.

РЕДАКТИРОВАТЬ

Теперь это происходит со мной на стабильной машине Debian, как описано выше. На этот раз никаких обновлений или чего-то еще, просто стабильно.

Да, год спустя. До сих пор не знаю, в чем проблема.

Вот как это выглядит сейчас (мало что изменилось):

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
terraria@skaianet:~$ tty
/dev/pts/0
terraria@skaianet:~$ ls -l /dev/pts/0
crw--w---- 1 root root 136, 0 Oct 10 19:21 /dev/pts/0
terraria@skaianet:~$ ls -l /dev/pts/
crw--w---- 1 root root 136, 0 Oct 10 19:21 0
crw--w---- 1 root root 136, 2 Sep 22 17:47 2
crw--w---- 1 root root 136, 3 Sep 26 19:30 3
c--------- 1 root root   5, 2 Sep  7 10:50 ptmx

Strace генерируется так:

root@skaianet:~$ strace -f -o tracelog su terraria -

..также проявляется какое-то непонятное поведение. Эти сообщения довольно запутанные. Некоторые выбранные строки:

readlink("/proc/self/fd/0", "/dev/pts/0", 4095) = 10
#Error code 10? 
15503 open("/dev/tty", O_RDWR|O_NONBLOCK) = -1 ENXIO (No such device or address)
#Yes there is, and I can interact with it normally
15503 ioctl(255, TIOCGPGRP, [32561])    = -1 ENOTTY (Inappropriate ioctl for device)

Я связал полный вывод этого сеанса strace - все, что я сделал, это запустил команду su, а затем сразу же нажал ctrl + d из терминала.

Майки Т.К.
источник
1
Привет Майк. Вы нашли проблему?
Мирча Вутцовичи

Ответы:

33
  • su - usernameинтерпретируется в соответствии с Вашими suозначает «запустить имя пользователя «ы оболочки как интерактивная оболочка»
  • su username -интерпретируется suкак «запустить следующую неинтерактивную команду ( -) как имя пользователя »
  • последний работал только потому, что:
    • ваши suпропускающие конечные аргументы shдля разбора
    • shпринимает -означает «бег в качестве регистрационной оболочки (читать /etc/profile...)»

Но что вас действительно интересует, так это: почему неинтерактивен ? Совместное использование управляющего терминала между привилегированным родителем и непривилегированным дочерним элементом делает вас уязвимым для « повышения привилегий обратного вызова TTY », или TIOCSTIошибки, так что, если вам действительно не нужно, она su отсоединяется от него . Когда вы использовали su username -форму, su вы поняли, что вам не нужен управляющий терминал .

Только процессы с управляющим терминалом могут иметь лидеров сеансов, которые управляют группами процессов (выполняют управление заданиями); след, который вы дали, bashобнаруживает, что он не может быть лидером сеанса.

Вы упоминаете:

Странно то, что обе формы отлично работают в Ubuntu и CentOS 6, однако в ванильном Debian только первая форма работает без ошибок.

Игнорирование варианты нравится suxи sudoесть по крайней мере три [1] версии suна Linux: coreutils, util-linuxи shadow-utilsиз которого Debian приходит. Справочная страница последнего указывает:

Эта версия su имеет множество опций компиляции, только некоторые из которых могут использоваться на любом конкретном сайте.

и Debian идет с флагом old_debian_behavior; другие версии могут иметь аналогичные параметры времени компиляции / выполнения. Другая причина изменчивости может заключаться в том, что возникли некоторые споры [2] относительно того, suследует ли когда-либо использовать этот метод для удаления привилегий и, TIOCSTIследовательно, является ли ошибка ошибкой вообще (Redhat изначально закрыл ее как "WONTFIX" ).

[1]: Изменить: добавить SimplePAMAppsи hardened-shadowк этому.

[2]: у Solar Designer есть (старые) мнения, которые, я думаю, стоит прочитать.

ZakW
источник
2
Это отличный ответ, и лучше всего это объясняет почему. Я хотел бы, чтобы вы были здесь год назад :)
Майки TK
1

Я бы проверил владельца и разрешения для / dev / pts * или для новой конфигурации для udev, связанной с устройствами / dev / pts, которая не была заменена во время процесса обновления.

Вы также можете попытаться выяснить, что syscal генерирует ошибку, запустив от имени пользователя root:

strace -f su - username 2>stderr.log
Мирча Вуцовичи
источник
2
Лучше добавить -fк этому strace, если su решает запустить оболочку в качестве подпроцесса, что сейчас кажется распространенным явлением. Системный вызов для установки группы процессов переднего плана терминала, ioctl(..., TIOCSPGRP, ...)и мы уже знаем, что это не удалось с ENOTTY (неуместным ioctl для устройства), так что часть strace не сильно поможет. Но -можно сравнить две версии команды (с и без ), чтобы выяснить, почему TIOCSPGRP дает сбой.
Алан Карри
Это выглядит как многообещающее лидерство. Глядя в мою папку / dev / pts, есть ровно два элемента, а именно 0, разрешения, установленные как 600, принадлежащие пользователю, вошедшему в систему как, и ptmxпринадлежащему пользователю root с нулевыми разрешениями.
Майки TK
1
Когда вы получите приглашение оболочки после No job controlсообщения, запустите команду, ttyи она сообщит вам, какой tty вы используете. Тогда ls -lэто.
Алан Карри
@AlanCurry, ты прав, я добавлю -f. Спасибо!
Мирча Вутцовичи
@AlanCurry - он вернулся. Я обновил исходный вопрос информацией, предложенной Мирчей.
Майки TK