我有一个假设的问题。 说我有一个文件,我只希望某些进程能够读取和修改。 我将如何去执行这个?
目前经过一番思考,最好的方法似乎是基于限制进程组的访问。 就像在* 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位。
运行时,可执行文件(及其子进程)将具有该组的标识,因此可以访问这些文件。
有关详细信息,请参阅CHMOD(1)。
此设置通常用于让游戏独占访问分数文件以防止外部篡改。 看看你的/ usr / games,你可能会发现一些setgid可执行文件的例子。