와일드카드와 함께 sudo를 사용하여 루트 소유 디렉터리에서 파일 제거

와일드카드와 함께 sudo를 사용하여 루트 소유 디렉터리에서 파일 제거

/var/log/nginx보호되는(루트가 소유하고 다른 누구도 읽거나 쓸 수 없는) 폴더가 있다고 가정해 보겠습니다 . sudo를 사용해도 sudo rm -f /var/log/nginx/ab*"해당 파일이나 디렉터리가 없습니다."라는 메시지가 나오지 않고 는 할 수 없습니다 . 이 작업을 수행하려면 실제로 루트 셸을 로드해야 합니까, 아니면 다른 방법이 있습니까?

답변1

원인

쉘은 별표와 같은 모든 glob 문자(와일드카드)를 해석하고 확장합니다. 명령에 대한 이러한 해석은 sudo디렉터리에 대한 읽기 권한이 없는 현재 셸(명령이 실행되기 전)에서 발생합니다. 현재 쉘은 glob 패턴과 일치하는 파일을 찾을 수 없으므로 경로 이름 확장이 수행되지 않으며 쉘은 rm, -f/var/log/nginx/ab*(리터럴 별표 사용)을 명령에 대한 인수로 전달합니다 sudo.

sudo그러면 이 명령은 rm경로가 있는 파일을 제거하려고 시도하는 명령을 시작합니다 /var/log/nginx/ab*(별표는 Unix 파일 이름에 적합한 문자입니다). 그러한 파일은 실제로 존재하지 않으므로 실패를 보고합니다. GNU에서는 rm이 오류 메시지가 명시적입니다. 그만큼가득한아래 오류 메시지는 제거되는 (단일) 파일이 존재하지 않음을 나타냅니다.

rm: cannot remove `/var/log/nginx/ab*': No such file or directory

해결책

해결책은 파일 이름 확장을 수행하는 데 필요한 권한이 있는 수퍼유저로 새 셸을 시작하는 것입니다.

sudo bash -c "rm -f /var/log/nginx/ab*"

위 명령은 루트로 실행되는 새 셸을 시작하고 -c옵션은 셸에서 실행할 명령을 전달하는 데 사용됩니다. 명령이 인용되어 있으므로 별표는 현재 쉘에서 해석되지 않고 그대로 새 루트 쉘에 전달되어 명령을 실행하기 전에 경로 이름을 확장할 수 있습니다 rm.

답변2

파일 이름에 문제가 있거나 파일 이름에 공백이 있을 수 있습니다.

따라서 다음 해결 방법을 시도해 보십시오.

  1. --옵션의 끝을 나타내기 위해 before를 시도해 보세요 . 예:

    sudo rm -vf -- /var/log/nginx/ab*
    
  2. 사용 find:

    sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. 파일이 Linux에서 보호되고 있다고 생각되면 먼저 보호를 제거해 보십시오.

    chattr -i ab*
    

관련 정보