Как читать возможности файлов с помощью Python?

В системах Linux привилегии root могут предоставляться более выборочно, чем добавление бита setuid с использованием возможностей файла. Подробности см. В capabilties(7) . Это атрибуты файлов и могут быть прочитаны с getcap программы getcap . Как эти атрибуты можно получить в Python?

Несмотря на то, что getcap программы getcap с использованием, например, subprocess для ответа на такой вопрос, возможно, нежелательно при извлечении очень многих возможностей.

Должно быть возможно разработать решение с использованием ctypes . Существуют ли альтернативы этому подходу или даже библиотеки, облегчающие эту задачу?

One Solution collect form web for “Как читать возможности файлов с помощью Python?”

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' 

Для версии 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) 

который дает мне:

 '= cap_net_raw+p' 

вероятно, более полезно для вас.

PS : обратите внимание, что cap_to_text возвращает строку malloc ed. Это ваша работа, чтобы освободить его, используя 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 .

  • автоматически добавлять клиентов на сервер nagios
  • Запустите скрипт, когда пользователь нажмет печать, а не начнет буферизацию до окончания скрипта (linux, cups)
  • jsoncpp (Linux) - инструкция для нас простых смертных?
  • Рекомендуемое развертывание Django
  • pySerial отлично работает в интерпретаторе Python, но не является автономным
  • Какой пользователь Ansible выполнит мои команды как?
  • основы создания консоли MML в Python
  • Обнаружение USB Python
  • Python потерял контроль над подпроцессом?
  • Программный разговор с последовательным портом в OS X или Linux
  • OpenCV и python / virtualenv?
  • Python - лучший язык программирования в мире.