我必须编写一个在启动时运行的脚本(这是我还不知道如何执行的部分),该脚本会删除当前用户的临时文件,并且出现“权限被拒绝”错误。错误看起来像这样:
'/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
去查找并删除$USER
in拥有的任何文件到处都是 /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
不是命令,而是触发陷阱的条件。条件可以是信号、特殊值0
或EXIT
。这两个特殊值都意味着“每当此 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 +3
3 天前的文件
find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -atime +3 -user $USER -exec rm -f {} \;