我有一个假设的问题。假设我有一个文件,我只希望某些进程能够读取和修改。我将如何实现这一目标?
目前经过一番思考后,最好的方法似乎是基于限制对流程组的访问。就像在* nix中,如何更改文件的权限以便为某个组中的用户提供rwx访问权限,是否可以仅将文件的rwx访问权限授予属于某个进程组的进程?我的方法在这里有效还是有更简单的方法来做这个?
答案 0 :(得分:2)
您谈论的三个级别上存在文件权限。所有者 - >所有者组 - >所有。但是,当进程运行时,它将在某个用户(启动它的用户)的权限下运行并继承权限。我假设你想要创建一个唯一的用户组,在该权限下运行进程并限制文件只能访问该组。
为什么你不能使用这样的方法会有限制吗?
答案 1 :(得分:1)
你也可能对access control lists
感兴趣就个人而言,我从未使用它们,因为我不需要对访问进行如此精细的控制
答案 2 :(得分:1)
你不能这样做,但你可以通过以下步骤实现这个效果:
首先创建一个新组,使其成为文件的所有者,并设置权限以排除组外的访问权。
然后使该组成为可执行文件的所有者并设置其setgid位。
运行时,可执行文件(及其子进程)将具有该组的ID,因此可以访问这些文件。
有关详细信息,请参阅CHMOD(1)。
此设置通常用于为游戏提供对乐谱文件的独占访问权限,以防止外部篡改。查看/ usr / games,您可能会找到一些setgid可执行文件的例子。
答案 3 :(得分:1)
如果我理解正确你想根据进程组锁定写入文件,在这种情况下你可以组合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;
}