Ale*_*rov 4 linux debian shell-script files access-control
我有一个进程 P 将内容写入文件 F。我需要能够动态启用/禁用 P 写入 F。我尝试更改用户/组的权限,但这需要重新启动进程(实际上整个系统)。最后,我应该能够执行一个“脚本”,它执行以下操作:
EnablePWriteF
sleep 10
DisablePWriteF
Run Code Online (Sandbox Code Playgroud)
结果 P 将能够在前 10 秒内写入,之后就不能写入了。我正在使用 Debian 发行版。
这可能吗?
更新:真正的用例是我试图过滤给定的进程以写入特定的设备文件 /dev/fb0 我有两个正在写入该文件的进程,我希望能够准确地确定两者之一允许在给定时刻写入该文件而无需终止/停止进程。
不,不是真的(据我所知)。文件访问权限仅在文件打开时检查(并且没有系统调用来撤销它们),因此如果进程具有具有写权限的文件句柄,则它具有写权限。
(如果您chmod对文件进行了简单操作,则不需要重新启动。如果您更改例如组成员身份,则需要再次登录以使更改生效。)
通常,您可以做的是将输出定向到管道,并让管道的读取端控制是处理(或转发)数据还是丢弃它。(不过,后来关于用例是某些设备文件的澄清使这有点没有实际意义。)
至少在我的 Linux 版本上,您似乎可以使用强制锁。我只用 对其进行了测试/dev/null,但我看不出它为什么不能与其他设备(例如您的帧缓冲区)一起使用的任何原因:
作为根:
mount -t tmpfs -o mand locked-fb some-dir
cp -a /dev/fb0 some-dir/fb0-for-process-A
cp -a /dev/fb0 some-dir/fb0-for-process-B
chmod g+s some-dir/fb0-for-process-[AB] # enable mand-lock
Run Code Online (Sandbox Code Playgroud)
然后例如,使用perl和File::FcntlLock模块(或直接在 C 中执行):
#! /usr/bin/perl
use File::FcntlLock;
$l = new File::FcntlLock;
$l->l_type(F_RDLCK);
open my $fba, '<', 'some-dir/fb0-for-process-A' or die$!;
sleep 10; # writing OK
$l->lock($fba, F_SETLK); # writing blocked on fb0-for-process-A
sleep 10;
exit; # lock now released (or do an explicit unlock)
Run Code Online (Sandbox Code Playgroud)
让一个进程通过fb0-for-process-A文件打开 fb0 设备,另一个进程通过fb0-for-process-B对两个文件应用锁定来决定哪个进程可以在给定时间写入。