2017-04-25 96 views
1

在調用目錄上的chmod()之前,如果調用者不擁有目錄,我想測試調用者是否具有CAP_FOWNER的能力。在C中測試linux的CAP_FOWNER能力?

從搜索,似乎我應該可以通過調用capable(CAP_FOWNER)以測試CAP_FOWNER能力 - 但capable()是不是我的男人頁面之間似乎並沒有被<linux/capability.h>出口。

什麼是capable()的正確包含文件,或者,測試linux功能的最簡單/最好的方法是什麼?

回答

1

我認爲capable()在內核源代碼中可用,但不能用於一般用途。如果您正在編寫設備驅動程序或模塊,那麼它應該可用。

如果您正在編寫用戶空間程序,那麼您可能可以使用由libcap提供的函數;見man capabilitesman libcap。我建議#include <sys/capability.h>和使用cap_get_proc()和可能CAP_IS_SUPPORTED(CAP_FOWNER)

如果這樣做不好,顯而易見的解決方法是嘗試chmod()目錄和處理可能的失敗。

+0

這讓我走上了正軌。解決方案歸結爲這些調用: 'cap_t cap = cap_get_proc(); cap_flag_value_t v = 0; cap_get_flag(cap,CAP_FOWNER,CAP_EFFECTIVE,&v);' – Conquistadog

0

在調用目錄上的chmod()之前,我想測試調用者是否具有CAP_FOWNER能力。

你有理由在應用程序方面做到這一點嗎?如果進程調用chmod()(或任何其他系統調用),內核將在任何情況下檢查是否允許進程執行該操作,如果不是,則返回EPERMEACCES。在應用程序端檢測這是一個非常簡單的測試,並且應用程序在任何情況下都需要進行測試,因爲應用程序可能不知道內核完成的所有訪問控制。 (比如想想SELinux)

一般來說,測試第一聽起來很像Time of check to time of use問題。對於非特權進程,這不是問題,但是如果你的進程代表另一個用戶做了一些工作(進程的實際特權高於它想授予用戶的權限),它很快就會變成一個。

+0

有幫助,但我仍然想回答我實際詢問的問題。 – Conquistadog