如何让用户A代表B删除B的文件?

如何让用户A代表B删除B的文件?

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条目可能会更好。

相关内容