Python 3.3 にはos.getxattr
. そうでない場合、ええ... 1つの方法は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'
Python 3.3 のバージョンでは、 のos
代わりに , をインポートするだけで、本質的に同じですxattr
。ctypes
ただし、もう少し複雑です。
今、生の結果を取得しています。つまり、これら 2 つはテキスト属性を取得する場合にのみ最も役立ちます。しかし... ,自体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)
それは私に与える:
'= cap_net_raw+p'
おそらくあなたにとってより便利です。
PS : ed 文字列をcap_to_text
返すことに注意してください。malloc
を使用して割り当てを解除するのはあなたの仕事です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)
その中で8192
、アクティブなビットは 13 番目だけです。にアクセスすると、が で定義されlinux/capability.h
ていることがわかります。CAP_NET_RAW
13
これらすべての定数を含むモジュールを作成したい場合は、情報をデコードできます。ctypes
しかし、単に+を使用するよりもはるかに面倒だと思いますlibcap
。