/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 {} +

또는 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/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보다 큰 파일을 찾아 삭제합니다.

관련 정보