![在 /tmp 下找到较大的文件(由 oracle 用户拥有,大小大于 1 MiB)并截断它们](https://linux22.com/image/196533/%E5%9C%A8%20%2Ftmp%20%E4%B8%8B%E6%89%BE%E5%88%B0%E8%BE%83%E5%A4%A7%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%88%E7%94%B1%20oracle%20%E7%94%A8%E6%88%B7%E6%8B%A5%E6%9C%89%EF%BC%8C%E5%A4%A7%E5%B0%8F%E5%A4%A7%E4%BA%8E%201%20MiB%EF%BC%89%E5%B9%B6%E6%88%AA%E6%96%AD%E5%AE%83%E4%BB%AC.png)
我的要求是找到用户/tmp
拥有的oracle
、大小大于 1 MiB 的文件,然后截断这些文件(清空它们)。有人可以帮我解决这个问题吗?
答案1
要将文件大小减小到 0:
find /tmp/ -size +1048576c -user oracle -type f -exec truncate -s0 {} +
如果您的系统没有truncate
命令:
find /tmp/ -size +1048576c -user oracle -type f -exec sh -c '
ret=0
for file do
true > "$file" || ret=$?
done
exit "$ret"' sh {} +
但请注意,两者都是不安全的,因为它们有竞争条件。恶意用户可以使用符号链接替换文件或目录,该符号链接指向 1 之外的某个位置,在查找文件和调用截断它们的/tmp
时间之间,允许它们让您截断文件系统上的任何文件。find
truncate
如果您find
支持-execdir
并且zsh
在系统上可用,您可以通过执行以下操作来避免它:
find /tmp/ -size +1048576c -user oracle -type f -execdir zsh -c '
zmodload zsh/system
ret=0
for file do
sysopen -o nofollow,truncate -wu3 -- $file || ret=$?
done
exit $ret' zsh {} +
或者使用 GNUfind
和 GNU dd
:
find /tmp/ -size +1048576c -user oracle -type f -execdir \
dd 'of={}' conv=nocreat oflag=nofollow status=none ';' < /dev/null
要删除文件而不是缩小它们,您可以执行以下操作:
find /tmp/ -size +1048576c -user oracle -type f -delete
至少对于 GNU 来说find
是无竞争的。或者:
find /tmp/ -size +1048576c -user oracle -type f -execdir rm -f {} +
其他注意事项:
- 如果本身是符号链接,则确实需要尾随
/
。在这种情况下,只会考虑符号链接本身。/tmp
/tmp
find /tmp
/tmp
-type f
是限制于常规的文件(不包括所有其他类型的文件,包括符号链接、目录、fifo、设备)。
1 尽管恶意行为者要能够对 拥有的文件执行此操作oracle
,您需要一个允许对不属于您的文件建立硬链接的系统(如sysctl -w fs.protected_hardlinks=0
Linux 上的之后),或者持有这些 oracle 的目录的权限- 拥有的文件首先过于宽松,或者oracle
uid 本身受到损害。
答案2
find /tmp -user oracle -size +1M -exec rm -rf {} \;
将找到用户 oracle 拥有的大于 1 MB 的文件并将其删除。