我有一个假设性问题。假设我有一个文件,我只希望某些进程能够读取和修改。我将如何实施呢?
目前,经过一些思考,最好的方法似乎是基于限制对进程组的访问。就像在 *nix 中一样,如何更改文件的权限以向某个组中的用户授予 rwx 访问权限是否可以仅将文件的 rwx 访问权限授予属于某个进程组的进程?我的方法在这里有效还是有更简单的方法可以做到这一点?
我有一个假设性问题。假设我有一个文件,我只希望某些进程能够读取和修改。我将如何实施呢?
目前,经过一些思考,最好的方法似乎是基于限制对进程组的访问。就像在 *nix 中一样,如何更改文件的权限以向某个组中的用户授予 rwx 访问权限是否可以仅将文件的 rwx 访问权限授予属于某个进程组的进程?我的方法在这里有效还是有更简单的方法可以做到这一点?
文件权限存在于您所说的三个级别上。所有者 -> 所有者组 -> 全部。但是,当一个进程运行时,它会在某个用户(启动它的用户)的权限下运行并继承这些权限。我会假设您想要创建一个唯一的用户组,在该权限下运行进程并限制文件仅对该组的访问。
为什么你不能使用这样的方法会有限制吗?
如果我理解正确,您想根据进程组锁定文件以进行写入,在这种情况下,您可以结合 fcntl 和 gpgrp
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#define ALLOWED_GROUP 500
int main(int argc, char *argv[])
{
struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0};
int fd;
fl.l_pid = getpid();
if (argc > 1 || getpgrp() != ALLOWED_GROUP)
fl.l_type = F_RDLCK;
if ((fd = open("demo.c", O_RDWR)) == -1) {
perror("open");
exit(1);
}
printf("Press <RETURN> to try to get lock: ");
getchar();
printf("Trying to get lock...");
if (fcntl(fd, F_SETLKW, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("got lock\n");
printf("Press <RETURN> to release lock: ");
getchar();
fl.l_type = F_UNLCK;
if (fcntl(fd, F_SETLK, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("Unlocked.\n");
close(fd);
return 0;
}
您也可能对访问控制列表感兴趣
就个人而言,我从未使用过它们,因为我不需要对访问进行如此精细的控制
您不能这样做,但您可以通过以下步骤实现此效果:
首先创建一个新组,使其成为文件的所有者并设置权限以排除组外的访问。
然后将该组设为可执行文件的所有者并设置其 setgid 位。
运行时,可执行文件(及其子进程)将具有组的 ID,因此可以访问文件。
有关详细信息,请参见 CHMOD(1)。
此设置通常用于为游戏提供对乐谱文件的独占访问权限,以防止外部篡改。查看您的 /usr/games,您可能会找到一些 setgid 可执行文件的示例。