Hel*_*hne 9 python linux linux-capabilities
在Linux系统上,可以比使用文件功能添加setuid位更有选择性地授予root权限.详情capabilities(7)请见.这些是文件的属性,可以使用该getcap程序读取.如何在Python中检索这些属性?
即使getcap使用例如subprocess用于回答这样的问题来运行程序也是可能的,但是在检索非常多的能力时是不可取的.
应该可以使用设计解决方案ctypes.是否有替代方法或甚至图书馆促进这项任务?
Python 3.3附带os.getxattr.如果没有,是的......一种方法是使用ctypes,至少是为了得到原料,或者可能使用pyxattr
用于pyxattr:
>>> import xattr
>>> xattr.listxattr("/bin/ping")
(u'security.capability',)
>>> xattr.getxattr("/bin/ping", "security.capability")
'\x00\x00\x00\x02\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)
对于Python 3.3的版本,它基本上是相同的,只是导入os,而不是xattr.ctypes但是更多的是参与其中.
现在,我们得到原始结果,这意味着这两个最有用的只是检索文本属性.但是......我们可以getcap通过libcap自己使用相同的方法:
import ctypes
libcap = ctypes.cdll.LoadLibrary("libcap.so")
cap_t = libcap.cap_get_file('/bin/ping')
libcap.cap_to_text.restype = ctypes.c_char_p
libcap.cap_to_text(cap_t, None)
Run Code Online (Sandbox Code Playgroud)
这给了我:
'= cap_net_raw+p'
Run Code Online (Sandbox Code Playgroud)
可能对你更有用.
PS:注意cap_to_text返回一个malloced字符串.使用它来解除分配是你的工作cap_free
提示"二进制乱码":
>>> import struct
>>> caps = '\x00\x00\x00\x02\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> struct.unpack("<IIIII", caps)
(33554432, 8192, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
在那里8192,唯一的有效位是第13位.如果你去linux/capability.h,你会看到它CAP_NET_RAW被定义为13.
现在,如果您想编写一个包含所有这些常量的模块,您可以解码信息.但我会说这比仅使用ctypes+ 更费力libcap.
| 归档时间: |
|
| 查看次数: |
1253 次 |
| 最近记录: |