删除某个用户的临时文件时发现权限被拒绝

删除某个用户的临时文件时发现权限被拒绝

我必须编写一个在启动时运行的脚本(这是我还不知道如何执行的部分),该脚本会删除当前用户的临时文件,并且出现“权限被拒绝”错误。错误看起来像这样:

'/tmp/systemd-private-long number-colord.service-LTsv8G' : permission denied ;
'/tmp/systemd-private-long number-systemd-timesyncd.service-PxhNq0' : permission denied ;
'/tmp/systemd-private-long number-rtkit-daemon.service-KQN6zN' : permission denied

到目前为止,这是我的代码:

TMPFILE=$(mktemp)|| exit 1
find /tmp -type f -user $USER -exec rm -f {} \;

如果我ls -l在创建 TMPFILE 之后运行,我会得到:

total 4
-rwxrwxrwx 1 bristena bristena 530 may 25 10:51 sh.01

如果我这样做cd /tmp然后我跑 ls -l我得到

total 12
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-colord.service-LTsv8G
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-rtkit-daemon.service-KQN6zN
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-systemd-timesyncd.service-PxhNq0
-rw------- 1 bristena bristena 0 may 25 10:51 tmp.j0rvQtmz7G

从网上看到的我也可以使用trap "rm -f TMPFILE; exit",但我不知道如何整合当前的用户需求

我们将非常感谢您的所有帮助

答案1

find /tmp -type f -user $USER -exec rm -f {} \;告诉我们find去查找并删除$USERin拥有的任何文件到处都是 /tmp

现在,您/tmp包含 root 拥有的子目录。理论上他们可以包含更多属于 的文件$USER。因此,find将尝试查看这些目录来查找它们。但是root拥有的目录具有权限drwx------,因此只有root才能以任何方式访问它们。

结果find会报出它无法进入的目录,告诉你它无法搜索到处因此理论上/tmp它可能会错过一些东西。

除非另有指定,否则在系统启动时运行的脚本将以 root 身份运行,因此,如果您在系统启动脚本中运行相同的命令,它将具有对所有目录的完全访问权限,/tmp并且根本不会出现此问题find:因为 root 能够对/tmp.

但是,如果您作为自己的用户帐户运行它,那么您必须忽略“权限被拒绝”错误,因为您期望它们,或者执行更复杂的搜索,首先查找$USER可以访问的目录/tmp,然后删除其中的任何文件。

或者,如果您只想查找由同一脚本创建的临时文件,那么您可能需要查看目录中的临时/tmp文件仅有的,并忽略 的任何子目录/tmp。如果你想这样做,请谷歌搜索如何使用;-prune的选项find这有点棘手。

命令trap略有不同。它可用于确保您的脚本始终清理其临时文件(除非被无法捕获的信号(例如SIGKILL系统崩溃)杀死)。在 POSIX 兼容的 shell 中,您可以像这样使用它:

TMPFILE=$(mktemp)|| exit 1
trap "rm -f $TMPFILE" EXIT

在此trap命令中,EXIT不是命令,而是触发陷阱的条件。条件可以是信号、特殊值0EXIT。这两个特殊值都意味着“每当此 shell 进程因任何原因退出时,都应执行此陷阱操作”。

答案2

为了避免出现以下错误消息

find /tmp -type f -user $USER -exec rm -f {} \;

你可以重定向它们

find /tmp -type f -user $USER -exec rm -f {} \; 2>/dev/null

或防止find遇到该问题:

find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -user $USER -exec rm -f {} \;

答案3

这个很好,你甚至可以添加-atime +33 天前的文件

find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -atime +3  -user $USER -exec rm -f {} \;

相关内容