사용자의 임시 파일을 삭제하는 동안 권한이 거부되었습니다.

사용자의 임시 파일을 삭제하는 동안 권한이 거부되었습니다.

현재 사용자의 임시 파일을 삭제하고 "권한 거부됨" 오류가 발생하는 시작 시 실행되는 스크립트(아직 어떻게 해야 할지 모르겠습니다)를 작성해야 합니다. 오류는 다음과 같습니다.

'/tmp/systemd-private-long number-colord.service-LTsv8G' : permission denied ;
'/tmp/systemd-private-long number-systemd-timesyncd.service-PxhNq0' : permission denied ;
'/tmp/systemd-private-long number-rtkit-daemon.service-KQN6zN' : permission denied

이것은 지금까지 내 코드입니다.

TMPFILE=$(mktemp)|| exit 1
find /tmp -type f -user $USER -exec rm -f {} \;

ls -lTMPFILE을 생성한 후 실행 하면 다음과 같은 결과를 얻습니다.

total 4
-rwxrwxrwx 1 bristena bristena 530 may 25 10:51 sh.01

내가 이것을 하고 cd /tmp달리면 ls -l나는 얻는다.

total 12
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-colord.service-LTsv8G
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-rtkit-daemon.service-KQN6zN
drwx------ 3 root root 4096 may 25 10:14 systemd-private-long number-systemd-timesyncd.service-PxhNq0
-rw------- 1 bristena bristena 0 may 25 10:51 tmp.j0rvQtmz7G

온라인에서 본 내용을 사용할 수 있지만 trap "rm -f TMPFILE; exit"현재 사용자 요구 사항을 통합하는 방법을 모르겠습니다.

우리는 귀하의 모든 도움에 매우 감사할 것입니다

답변1

다음에서 소유한 모든 파일을 찾아 삭제하라고 지시 find /tmp -type f -user $USER -exec rm -f {} \;합니다 .find$USER어디에나 /tmp.

이제 /tmp루트가 소유한 하위 디렉터리를 포함합니다. 이론적으로 그들은할 수 있다에 속하는 더 많은 파일을 포함합니다 $USER. 따라서 find해당 디렉토리를 찾기 위해 해당 디렉토리를 조사하려고 시도합니다. 그러나 루트가 소유한 디렉터리에는 권한이 있으므로 drwx------루트만 어떤 방식으로든 액세스할 수 있습니다.

결과는 find입력할 수 없는 디렉토리를 보고하고 검색할 수 없음을 알려줍니다.어디에나따라서 이론적으로 /tmp는 뭔가를 놓칠 수 있습니다.

별도로 지정하지 않는 한 시스템 시작 시 실행되는 스크립트는 루트로 실행되므로 시스템 시작 스크립트에서 동일한 명령을 실행하면 모든 디렉터리에 대한 전체 액세스 권한을 갖게 되며 /tmp이는 전혀 표시되지 않습니다. 문제 find: 루트가 제어할 수 있기 때문에 /tmp.

그러나 자신의 사용자 계정으로 실행하는 경우 예상대로 "권한 거부" 오류를 무시하거나 먼저 $USER액세스 가능한 디렉터리를 찾은 /tmp다음 그 안에 있는 모든 파일을 삭제하는 보다 복잡한 검색을 수행해야 합니다.

또는 동일한 스크립트로 생성된 임시 파일만 찾으려면 디렉터리에 있는 임시 /tmp파일을 살펴보는 것이 좋습니다.오직을 클릭하고 하위 디렉터리는 무시합니다 /tmp. 이렇게 하려면 구글에서 사용법이 좀 까다롭습니다 -prune.find

명령어 trap가 약간 다릅니다. 이는 스크립트가 항상 임시 파일을 정리하는지 확인하는 데 사용할 수 있습니다(캐치할 수 없는 신호(예: SIGKILL시스템 충돌)로 인해 종료되지 않는 한). POSIX 호환 셸에서는 다음과 같이 사용할 수 있습니다.

TMPFILE=$(mktemp)|| exit 1
trap "rm -f $TMPFILE" EXIT

trap명령 에서는 EXIT명령이 아니라 트랩을 트리거하는 조건입니다. 조건은 신호, 특수 값 0또는 EXIT. 두 특수 값 모두 "어떤 이유로든 이 쉘 프로세스가 종료될 때마다 이 트랩 작업을 수행해야 합니다."를 의미합니다.

답변2

다음 오류 메시지를 방지하려면

find /tmp -type f -user $USER -exec rm -f {} \;

리디렉션할 수 있습니다.

find /tmp -type f -user $USER -exec rm -f {} \; 2>/dev/null

find또는 문제 발생을 방지하려면 다음 을 수행하십시오.

find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -user $USER -exec rm -f {} \;

답변3

좋습니다. -atime +33일 전의 파일 도 추가할 수 있습니다.

find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -atime +3  -user $USER -exec rm -f {} \;

관련 정보