Сообщить об ошибке.

Извлечение/установка uid, gid и pid процесса

Функции, представленные ниже дают возможность манипулировать с uid, gid и pid процесса. Чаще всего они используются авторами демонов или специальных системных программ, которым необходимо изменять уровень разрешений, а не запускаться от имени пользователя root. В конце раздела представлены некоторые примеры.

Содержание:


os.getegid():

Функции os.getegid() возвращает эффективный идентификатор (int) группы текущего процесса. Это соответствует биту "set id" в файле, выполняемом в текущем процессе.

Доступность: Unix.

os.geteuid():

Функции os.geteuid() возвращает текущий идентификатор (int) пользователя текущего процесса.

Доступность: Unix.

os.getgid():

Функции os.getgid() возвращает реальный идентификатор (int) группы текущего процесса.

Доступность: Unix.

os.getgrouplist(user, group):

Функции os.getgrouplist() возвращает список идентификаторов групп, к которым принадлежит пользователь user (str). Если группы group (int) нет в списке, она включается в нее. Как правило, группа указывается как поле идентификатора группы из записи пароля для пользователя.

Доступность: Unix.

os.getgroups():

Функции os.getgroups() возвращает список дополнительных идентификаторов групп, связанных с текущим процессом.

os.getlogin():

Функции os.getlogin() возвращает имя пользователя (str), вошедшего в систему на управляющем терминале процесса. Для большинства целей более полезно использовать getpass.getuser(), так как последний проверяет переменные среды LOGNAME или USERNAME, чтобы выяснить, кто пользователь, и возвращается к pwd.getpwuid(os.getuid())[0] чтобы получить логин реального текущего пользователя.

Доступность: Unix, Windows.

os.getpgid(pid):

Функции os.getpgid() возвращает идентификатор группы (int) процессов для процесса с идентификатором процесса pid. Если pid равен 0, возвращается идентификатор группы процессов текущего процесса.

Доступность: Unix.

os.getpgrp():

Функции os.getpgrp() возвращает идентификатор текущей группы процессов.

Доступность: Unix.

os.getpid():

Функции os.getpid() возвращает текущий идентификатор процесса.

os.getppid():

Функции os.getppid() возвращает идентификатор (int) родительского процесса. После выхода из родительского процесса в Unix возвращается идентификатор процесса init(1), в Windows это все тот же идентификатор, который уже может быть повторно использован другим процессом.

Доступность: Unix, Windows.

os.getpriority(which, who):

Функции os.getpriority() получает приоритет планирования программы. Аргумент which является одним из os.PRIO_PROCESS, os.PRIO_PGRP или os.PRIO_USER и аргумент who интерпретируется относительно which. Нулевое значение для who обозначает (соответственно) вызывающий процесс, группу процессов вызывающего процесса или реальный идентификатор пользователя вызывающего процесса.

Доступность: Unix.

os.PRIO_PROCESS,
os.PRIO_PGRP,
os.PRIO_USER
:

  • os.PRIO_PROCESS - идентификатор процесса,
  • os.PRIO_PGRP - идентификатор группы процессов,
  • os.PRIO_USER - идентификатор пользователя.

Параметры для функций os.getpriority() и os.setpriority().

Доступность: Unix.

os.getresuid():

Функции os.getresuid() возвращает кортеж (ruid, euid, suid), обозначающий реальные, эффективные и сохраненные идентификаторы пользователя текущего процесса.

Доступность: Unix.

os.getresgid():

Функции os.getresgid() возвращает кортеж (rgid, egid, sgid), обозначающий реальные, эффективные и сохраненные идентификаторы групп текущего процесса.

Доступность: Unix.

os.getuid():

Функции os.getuid() возвращает текущий идентификатор (int) пользователя текущего процесса.

Доступность: Unix.

os.initgroups(username, gid):

Функции os.initgroups() вызывает системную функцию initgroups(), чтобы инициализировать список группового доступа со всеми группами, членом которых является указанное имя пользователя username, плюс указанный идентификатор группы gid.

os.setegid(egid):

Функции os.setegid() устанавливает эффективный идентификатор группы egid (int) текущего процесса.

Доступность: Unix.

os.seteuid(euid):

Функции os.seteuid() устанавливает эффективный идентификатор пользователя euid (int) текущего процесса.

Доступность: Unix.

os.setgid(gid):

Функции os.seteuid() устанавливает идентификатор группы gid (int) текущего процесса.

Доступность: Unix.

os.setgroups(groups):

Функции os.setgroups() устанавливает список дополнительных идентификаторов групп groups, связанных с текущим процессом. Группы groups должны быть последовательностью и каждый элемент должен быть целым числом, идентифицирующим группу.Эта операция обычно доступна только суперпользователю.

Доступность: Unix.

Примечание. В Mac OS X длина групп не может превышать установленное системой максимальное количество эффективных групповых идентификаторов, обычно 16.

os.setpgrp():

Функции os.setpgrp() вызывает системный вызов setpgrp() или setpgrp(0, 0) в зависимости от того, какая версия реализована, если есть.

Доступность: Unix.

os.setpgid(pid, pgrp):

Функции os.setpgid() вызывает системный вызов setpgid(), чтобы установить идентификатор группы процессов для процесса с идентификатором pid для группы процессов с идентификатором pgrp.

Доступность: Unix.

os.setpriority(which, who, priority):

Функции os.setpriority() устанавливает приоритет планирования программы priority. Аргумент which является одним из os.PRIO_PROCESS, os.PRIO_PGRP или os.PRIO_USER и who интерпретируется относительно which. Нулевое значение для who обозначает (соответственно) вызывающий процесс, группу процессов вызывающего процесса или реальный идентификатор пользователя вызывающего процесса. Приоритет priority - значение в диапазоне от -20 до 19. Приоритет по умолчанию - 0, более низкие приоритеты вызывают более благоприятное планирование.

Доступность: Unix.

os.setregid(rgid, egid):

Функции os.setregid() устанавливает действительный rgid и эффективный egid идентификаторы групп текущего процесса.

Доступность: Unix.

os.setresgid(rgid, egid, sgid):

Функции os.setresgid() устанавливает действительный rgid, эффективный egid и сохраненный sgid идентификаторы групп текущего процесса.

Доступность: Unix.

os.setresuid(ruid, euid, suid):

Функции os.setresuid() устанавливает действительный ruid, эффективный euid и сохраненный suid идентификаторы текущего процесса.

Доступность: Unix.

os.setreuid(ruid, euid):

Функции os.setreuid() устанавливает действительный ruid и эффективный euid идентификаторы пользователя текущего процесса.

Доступность: Unix.

os.getsid(pid):

Функции os.getsid() вызывает системный вызов getsid().

Доступность: Unix.

os.setsid():

Функции os.setsid() вызывает системный вызов setsid().

Доступность: Unix.

os.setuid(uid):

Функции os.setuid() устанавливает идентификатор пользователя uid текущего процесса.

Примеры использования:

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

Заметка. Перед запуском примера измените значения TEST_GID и TEST_UID, чтобы они соответствовали реальному пользователю, определенному в системе.

# test-gid-uid.py
import os

TEST_GID = 1001
TEST_UID = 1001

def show_user_info():
    print(f'User (actual/effective): {os.getuid()}/{os.geteuid()}')
    print(f'Group (actual/effective): {os.getgid()}/{os.getegid()}')
    print('Actual Groups:', os.getgroups())

print('BEFORE CHANGE:')
show_user_info()
print()

try:
    os.setegid(TEST_GID)
except OSError:
    print('ERROR: Could not change effective group. '
          'Rerun as root.')
else:
    print('CHANGE GROUP:')
    show_user_info()
    print()

try:
    os.seteuid(TEST_UID)
except OSError:
    print('ERROR: Could not change effective user. '
          'Rerun as root.')
else:
    print('CHANGE USER:')
    show_user_info()
    print()

При запуске от имени пользователя в OS Linux:

docs-python@IdeaCentre:~$ python3 test-gid-uid.py 
BEFORE CHANGE:
User (actual/effective): 1000/1000
Group (actual/effective): 1000/1000
Actual Groups: [4, 24, 27, 30, 46, 116, 126, 1000]

ERROR: Could not change effective group. Rerun as root.
ERROR: Could not change effective user. Rerun as root.

Значения не меняются, потому что, когда он не запущен от имени пользователя root, процесс не может изменить значение своего эффективного владельца. Любая попытка установить эффективный идентификатор пользователя или идентификатор группы, отличный от идентификатора текущего пользователя, вызывает ошибку OSError. Выполнение того же скрипта с использованием sudo, чтобы он вызывался с привилегиями root:

docs-python@IdeaCentre:~$ sudo python3 test-gid-uid.py 
BEFORE CHANGE:
User (actual/effective): 0/0
Group (actual/effective): 0/0
Actual Groups: [0]

CHANGE GROUP:
User (actual/effective): 0/0
Group (actual/effective): 0/1001
Actual Groups: [0]

CHANGE USER:
User (actual/effective): 0/1001
Group (actual/effective): 0/1001
Actual Groups: [0]

Как только эффективный UID изменяется, процесс ограничивается разрешениями этого пользователя. Поскольку пользователи без полномочий root не могут изменить свою эффективную группу, программе необходимо изменить группу перед сменой пользователя.