【问题标题】:Python 2.7.3 errno 13 opening 777 permission file using effective uidPython 2.7.3 errno 13 使用有效uid打开777权限文件
【发布时间】:2013-01-30 20:19:28
【问题描述】:

我在 Linux 中的 2770 目录中有一个具有 777 权限的文件。作为 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()

发生了什么事?在这一点上我完全糊涂了。

【问题讨论】:

    标签: python file-permissions errno


    【解决方案1】:

    您不是t1 的所有者,因此所有者权限不适用于您。

    在第一种情况下,您的有效组不是FSTEST 组,因此组权限也不适用于您。在第二种情况下,您的有效组是FSTEST 组,因为 su 足够聪明地设置您的有效组以及您的有效用户(它们是单独的系统调用)。尝试使用

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

    【讨论】:

    • 这绝对是一个组权限问题...而不是仅仅使用 setegid,但是,我要做一个 os.setgroups([]) 以便用户所属的所有组都是包括。这是 su 的默认行为。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多