%20%E3%81%A7%E3%82%88%E3%82%8A%E5%A4%A7%E3%81%8D%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%A6%E5%88%87%E3%82%8A%E5%8F%96%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82.png)
私の要件は、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
ファイルを切り捨てることができます。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ユーザーが所有する1MBを超えるファイルを見つけて削除します。