A和B都是同一组中的非root用户。假设在 B 运行回归后,目录内会生成一些 B 拥有的垃圾文件(也由 B 生成和拥有),但我需要 A 执行清理工作,以防 B 的回归终止并且无法执行清理正确地起来。
我知道最简单的方法是让 B 在回归之前设置 umask 0002,但不幸的是,回归工具会以某种方式覆盖此设置,并生成只能由 B 写入的垃圾文件。
所以我尝试使用 suid 功能来解决这个问题。
demo目录如下
/proj/ttt> ll
total 0
-rw-r--r-- 1 B users 0 Mar 16 00:50 garbage.file
我尝试创建 B 拥有的脚本(cleanup)来清理垃圾文件。
#!/bin/bash
# cleanup
echo EUID=$EUID UID=$UID
rm -f garbage.file
然后我使用“chmod ug+s cleanup”将 suid 添加到该脚本中。目录变成
/proj/ttt> ll
total 0
-rwsr-sr-x 1 B users 57 Mar 16 00:50 cleanup
-rw-r--r-- 1 B users 0 Mar 16 00:50 garbage.file
我还为父目录添加了“s”位
drwsr-sr-x 2 B users 4096 Mar 16 00:57 ttt
但是当我作为A执行这个脚本时,似乎's'位不起作用并且A无法删除垃圾文件。
/proj/ttt> ./cleanup # executed by A
EUID=25264 UID=25264 # user B's uid is 25220, user A's uid is 25264
rm: cannot remove `garbage.file': Permission denied
不知道我的尝试有什么问题,或者这个方法最终是否可行?
或者还有其他更好的方法来完成这项工作吗?
答案1
标准方法是创建一个新组,使 A 和 B 都成为该组的成员,并确保所有有问题的文件(或者至少是目录,如果只是想删除)都属于该组并具有适当的权限。组权限。
将组视为权限集中的“规则”:每个特殊规则通常都需要创建一个组。
强制执行正确组所有权的一种方法是在属于该组的合适目录上设置 setgid(组)位,然后在此目录中创建的所有文件也将自动属于该组。您尝试这样做,但我不确定这是否是您的意图。请注意,您无法在目录上设置 setuid(用户)位。
通常不鼓励使用 setuid 可执行文件,除非确实有必要。如果你想走这条路,一些sudoer
条目可能会更好。