Как определить, какой пользователь и группа использует Python script?

У меня есть CGI script, который получает сообщение об ошибке IOError: [Errno 13] Permission denied в трассировке стека в журнале ошибок веб-сервера.

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

Я знаю, что могу просто распечатать значения в sys.stderr, но как выяснить, какой пользователь и группа script работает как?

(меня особенно интересует группа, поэтому переменная окружения $USER не поможет: CGI script имеет бит setgid, поэтому он должен работать как групповой "список" вместо веб-сервера ", www-data", но мне нужен код, чтобы увидеть, действительно ли это происходит.)

Ответы

Ответ 1

import os
print os.getegid()

Ответ 2

import os, getpass
print getpass.getuser()

Рассмотрим следующее script.

---- foo.py ---- 
import os, getpass
print "Env thinks the user is [%s]" % (os.getlogin());
print "Effective user is [%s]" % (getpass.getuser());

Рассмотрим запуск script.

$ python ./foo.py

приводит к

Env thinks the user is [jds]
Effective user is [jds]

теперь выполняйте

$ sudo -u apache python ./foo.py

приводит к

Env thinks the user is [jds]
Effective user is [apache]

Как вы можете видеть, эти два вызова os.getlogin() и getpass.getuser() - это не одно и то же. Основным принципом является то, как linux/и другие unix управляют работающим пользователем.

Рассмотрим

$ id -u

1000

против эффективного идентификатора текущего процесса.

$ sudo -u apache id -u

33

Примечание. Это именно то, что делают веб-серверы при запуске. Они создают песочницу (путем разветвления/развода терминала psudo и т.д.), и работает как другой пользователь. Подробную информацию о том, что здесь происходит, см. В главе "Процессы демона" в "Расширенное программирование" в среде UNIX.

Еще одна хорошая тема по этому вопросу.

Ответ 3

os.getgid() и os.getuid() могут быть полезны. Для других переменных среды загляните в os.getenv. Например, os.getenv('USER') на моей Mac OS X возвращает имя пользователя. os.getenv( "USERNAME" ) вернет имя пользователя на компьютерах Windows.