Ответ 1
import os
print os.getegid()
У меня есть CGI script, который получает сообщение об ошибке IOError: [Errno 13] Permission denied в трассировке стека в журнале ошибок веб-сервера.
Как часть отладки этой проблемы, я хотел бы добавить немного кода в script для печати пользователя и (особенно) группы, в которой script работает как, в журнале ошибок (предположительно STDERR).
Я знаю, что могу просто распечатать значения в sys.stderr, но как выяснить, какой пользователь и группа script работает как?
(меня особенно интересует группа, поэтому переменная окружения $USER не поможет: CGI script имеет бит setgid, поэтому он должен работать как групповой "список" вместо веб-сервера ", www-data", но мне нужен код, чтобы увидеть, действительно ли это происходит.)
import os
print os.getegid()
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.
Еще одна хорошая тема по этому вопросу.
os.getgid() и os.getuid() могут быть полезны. Для других переменных среды загляните в os.getenv. Например, os.getenv('USER') на моей Mac OS X возвращает имя пользователя. os.getenv( "USERNAME" ) вернет имя пользователя на компьютерах Windows.