/tmp (oracle ユーザー所有、サイズが 1MiB より大きい) でより大きいファイルを見つけて切り取ります。

/tmp (oracle ユーザー所有、サイズが 1MiB より大きい) でより大きいファイルを見つけて切り取ります。

私の要件は、1MiBより大きいユーザー所有/tmpのファイルを見つけて、そのファイルを切り捨てることです(空にする)。oracle誰でもこの問題を解決するのに役立ちますか?

答え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ユーザーが所有する1MBを超えるファイルを見つけて削除します。

関連情報