내 요구 사항은 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 {} +
또는 GNU find
및 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보다 큰 파일을 찾아 삭제합니다.