В C на Unix, как процесс может определить, какие права он имеет для файла, не открывая его? - PullRequest
1 голос
/ 16 июля 2009

Я могу использовать stat (), чтобы выяснить, какие права есть у владельца, группы или других пользователей, и я могу использовать geteuid () и getpwuid (), чтобы получить имя пользователя процесса. Я не совсем уверен, как получить группы, к которым принадлежит пользователь, без системного вызова.

Даже зная, как получить группы, кажется, что много работы по интеграции всей этой информации. Есть ли более простой способ?

Ответы [ 3 ]

8 голосов
/ 16 июля 2009

Функция *1001* access () может проверять разрешения, не открывая их. Однако для этого нужен системный вызов.

Функция access () должна проверять файл с именем pathname, на который указывает аргумент path, для обеспечения доступности в соответствии с битовой комбинацией, содержащейся в amode, используя реальный идентификатор пользователя вместо эффективного идентификатора пользователя и реального идентификатора группы вместо эффективного идентификатора группы.

Например:

access("/etc/passwd",W_OK)

проверяет, есть ли у вас права на запись в файл passwd. При использовании R_OK права на чтение проверяются.

Функция eaccess() (euidaccess является синонимом) использует эффективный идентификатор пользователя и группы. В то время как eaccess, похоже, широко поддерживается, насколько я знаю, он не является частью стандарта POSIX.

2 голосов
/ 16 июля 2009

unistd.h определяет функцию access () ,

int access(const char *path, int amode);

где путь - ваше имя файла, а amode - побитовое включение ИЛИ разрешений на доступ для проверки.

R_OK, W_OK и X_OK содержат значения режима для проверки прав на чтение, запись и поиск / выполнение соответственно.

int readable, readwritable;

//checking for read access
readable = access("/usr/bin/file", R_OK);

//checking for read and write access
readwritable = access("/usr/bin/file", R_OK|W_OK);

Полное описание доступа () вы можете найти в справочных страницах Unix.

1 голос
/ 06 октября 2009

acccess () проверяет имя файла, указанное аргументом пути. Недостатком здесь является то, что каждое разрешение на файл должно проверяться индивидуально с использованием флагов ниже R_OK Тест на разрешение на чтение. W_OK Тест на разрешение на запись. X_OK Проверка на выполнение или разрешение на поиск. F_OK Проверить наличие файла

...