在 /tmp 下找到较大的文件(由 oracle 用户拥有,大小大于 1 MiB)并截断它们

在 /tmp 下找到较大的文件(由 oracle 用户拥有,大小大于 1 MiB)并截断它们

我的要求是找到用户/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时间之间,允许它们让您截断文件系统上的任何文件。findtruncate

如果您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/tmpfind /tmp/tmp
  • -type f是限制于常规的文件(不包括所有其他类型的文件,包括符号链接、目录、fifo、设备)。

1 尽管恶意行为者要能够对 拥有的文件执行此操作oracle,您需要一个允许对不属于您的文件建立硬链接的系统(如sysctl -w fs.protected_hardlinks=0Linux 上的之后),或者持有这些 oracle 的目录的权限- 拥有的文件首先过于宽松,或者oracleuid 本身受到损害。

答案2

find /tmp -user oracle -size +1M -exec rm -rf {} \;将找到用户 oracle 拥有的大于 1 MB 的文件并将其删除。

相关内容