Python 2.7.3 errno 13 открывает файл разрешений 777 с использованием эффективного uid

У меня есть файл с разрешениями 777 в Linux внутри каталога с правами доступа 2770. Как root, я запускаю Python в интерактивном режиме и пытаюсь установить эффективный UID для пользователя без привилегий root (моя обычная учетная запись пользователя, UID 1010) для доступа к файл, но я получаю Errno 13

ОС: Linux (RHEL6U3)
Python: 2.7.3
Права доступа к родительскому каталогу: 2770 (принадлежит root, UID пользователя входит в группу)
Права доступа к файлам: 777 (-rwxrwxrwx)


Корневой родительский каталог:

[root@server / ]#  ls -AFlhd test
64K drwxrwxrwx  4 root FSTEST    2.1K Feb 14 20:42 test/


Родительский каталог:

[root@server /test ]#  ls -AFlhd t1
64K drwxrws---  4 root FSTEST    2.1K Feb 14 20:42 t1/


Файл:

[root@server /test/t1]#  ls -AFlh 06.dd
-rwxrwxrwx 1 root   root             1.0G Feb 14 19:34 06.dd*


Как создать проблему:

[root@server /test/t1]#  python
Python 2.7.3 (default, Jan 22 2013, 16:23:20) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> import os
>>> print(os.getresuid(),os.getresgid())
((0, 0, 0), (0, 0, 0))

>>> os.stat("06.dd")
posix.stat_result(st_mode=33279, st_ino=1064458, st_dev=64513L, st_nlink=1, st_uid=0, st_gid=0, st_size=1073741824, st_atime=1360875706, st_mtime=1360870449, st_ctime=1360875600)

>>> fp = open("06.dd")
>>> fp.close()
>>> os.seteuid(1010)
>>> print(os.getresuid(),os.getresgid())
((0, 1010, 0), (0, 0, 0))

>>> fp = open("06.dd")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 13] Permission denied: '06.dd'

Итак, вот необычная часть ... если я изменю разрешения родительского каталога на 777, fp=open("06.dd") будет работать с os.seteuid(1010)!

И еще более странная часть: если я подаю su своему пользователю и таким образом запускаю Python в интерактивном режиме, он также отлично работает без необходимости устанавливать для файла значение 777!

[root@server /test/t1]#  su - user ; cd /test/t1/
[user@server /test/t1 ]$ python
Python 2.7.3 (default, Jan 22 2013, 16:23:20) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.getresuid(),os.getresgid())
((1010, 1010, 1010), (1000, 1000, 1000))

>>> os.stat("06.dd")
posix.stat_result(st_mode=33279, st_ino=1064458, st_dev=64513L, st_nlink=1, st_uid=0, st_gid=0, st_size=1073741824, st_atime=1360875706, st_mtime=1360870449, st_ctime=1360875600)

>>> fp = open("06.dd")
>>> fp.close()

В чем дело? Я совершенно запутался в этот момент.


person JamCon    schedule 14.02.2013    source источник


Ответы (1)


Вы не являетесь владельцем t1, поэтому права владельца на вас не распространяются.

В первом случае ваша действующая группа не является группой FSTEST, поэтому разрешения группы также не применяются к вам. Во втором случае вашей эффективной группой является группа FSTEST, потому что su достаточно умен, чтобы установить вашу эффективную группу, а также вашего эффективного пользователя (это отдельные системные вызовы). Попробуйте использовать

os.setegid(1000)
os.seteuid(1010)
fp = open("06.dd")
person Neil    schedule 14.02.2013
comment
Это определенно была проблема с групповыми разрешениями ... однако вместо того, чтобы просто использовать setegid, я собираюсь сделать os.setgroups([]), чтобы были включены все группы, к которым принадлежит пользователь. Это поведение по умолчанию для su. Спасибо! - person JamCon; 15.02.2013