Вопрос или проблема
[user@localhost ~]$ umask
027
$ sudo su -
[root@localhost ~]# umask
0027
[root@localhost ~]# exit
[user@localhost ~]$ umask 0022
[user@localhost ~]$ umask
0022
$ sudo su -
[root@localhost ~]# umask
0022
Я думал, что su -
должен очищать переменные окружения и запускать оболочку входа в систему, но umask
не очищается. Почему?
Текущая маска создания файлов пользователя (umask) не определяется переменной окружения, поэтому она не затрагивается изменениями окружения, сделанными коммандами sudo
или su
. Umask является атрибутом процесса, и оболочка наследует его от родителя и не изменяет его, даже если это оболочка входа в систему — процесс, обрабатывающий фактический вход (например, login
), отвечает за установку umask (для login
используется /etc/login.defs
или умолчание 022 umask, и/или PAM).
Поскольку у PAM есть модуль установки umask (pam_umask
), вы можете настроить свою систему для сброса umask при использовании su
, но по умолчанию это не делается.
Ответ или решение
Проблема, связанная с унаследованием значения umask при переключении между учетными записями в системе Linux, может вызывать недоумение, особенно когда ожидания от использования команд, таких как sudo su -
, не совпадают с фактическим поведением. Разберем ситуацию более подробно.
Когда пользователь выполняет команду umask
, он получает текущее значение маски создания файлов для текущего процесса. В вашем примере наблюдаются различные значения umask для пользователя и суперпользователя root:
- Для пользователя было задано значение umask 027, и после использования команд
sudo su -
иumask
в сессии root, значение остаётся 0027. - Пользователь изменяет свой umask на 0022 и наблюдает, что после следующего входа под пользователем root с использованием
sudo su -
, значение umask теперь 0022.
На первый взгляд, это кажется странным, поскольку предполагалось, что команда su -
очищает все переменные окружения и начинает новый сеанс. Однако стоит учесть несколько нюансов, объясняющих такое поведение.
Основы работы umask
Umask представляет собой маску, определяющую права на создаваемые файлы и каталоги. Это не переменная окружения, а атрибут процесса, который каждый дочерний процесс наследует от родительского. Таким образом, когда вы используете sudo su -
, новый процесс оболочки bash наследует значение umask от процесса, запустившего sudo
.
Поведение команд sudo и su
Команда sudo
по умолчанию сохраняет часть окружения текущего пользователя, в том числе и umask. Таким образом, когда вы переключаетесь на пользователя root через sudo su -
, текущее значение umask будет унаследовано, если в конфигурации системы не предусмотрено его изменение.
Команда su -
в действительности создает новый сеанс, что включает загрузку профиля суперпользователя root, но при этом значение umask не изменяется по умолчанию, так как оно не зависит от переменных окружения, как уже упоминалось.
Рекомендации по настройке
Чтобы корректировать значение umask при переключении пользователей, возможно использование PAM (англ. Pluggable Authentication Modules) и конкретно модуля pam_umask
. Этот модуль позволяет устанавливать значение umask для различных сеансов и действий. Для реализации:
- Настройте файл конфигурации PAM для команд
sudo
иsu
, например,/etc/pam.d/su
. - Добавьте или измените строку установки umask в конфигурации, используя модуль
pam_umask
.
Заключение
Подводя итог, значение umask управляется на уровне процессов и не изменяется автоматически при переходе на другой пользовательский профиль через sudo su -
. Это объясняет, почему значение umask остается "утечкой" при переключении пользователей. Для решения данной задачи необходимо сконфигурировать PAM для установки желаемых параметров umask в конкретных сценариях.
Это объяснение помогает подробно понять, почему поведение команд отличается от ожиданий, а также каким способом можно достичь желаемого управления доступа к файлам.