Python 2.7.3 errno 13 打开777权限文件时使用有效用户ID

1 投票
1 回答
615 浏览
提问于 2025-04-17 15:55

我有一个文件在Linux系统中,它的权限是777,放在一个权限为2770的目录里。作为超级用户(root),我想在Python中以交互模式运行,并试图把有效用户ID(UID)设置为一个没有超级权限的用户(我自己的普通用户账号,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) 后正常工作!

更奇怪的是:如果我切换到我的用户身份,然后以这种方式运行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()

这是怎么回事?我现在完全搞不懂了。

1 个回答

1

你不是 t1 的拥有者,所以你没有拥有者的权限。

在第一种情况下,你的有效组不是 FSTEST 组,因此组权限对你也不适用。在第二种情况下,你的有效组是 FSTEST 组,因为 su 命令很聪明,它不仅设置了你的有效用户,还设置了你的有效组(这两个是不同的系统调用)。你可以试试使用

os.setegid(1000)
os.seteuid(1010)
fp = open("06.dd")

撰写回答