sudo를 사용하거나 루트로 폴더를 삭제하는 것의 차이점

sudo를 사용하거나 루트로 폴더를 삭제하는 것의 차이점

오늘 저는 sudo를 사용하여 명령을 실행하는 것과 루트로 명령을 실행하는 것 사이의 흥미로운 차이점을 발견했습니다.

sudo를 사용해 rm -rf /opt/nextcloud/*도 폴더는 삭제되지 않습니다.

vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud  nextcloud-16.0.4

처음 루트가 된 후 명령을 실행하면 폴더가 삭제됩니다.

vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~# 

왜 이런거야? sudo를 사용하여 폴더를 삭제하는 올바른 방법은 무엇입니까?

답변1

명령은 sudo rm -rf /opt/nextcloud/*일반 사용자로 실행되는 셸에 의해 해석됩니다. 쉘은 실행되기 *전에 확장을 시도합니다 sudo. 어떤 이유로 *확장할 수 없는 경우 명령은 다음과 같습니다.

  • sudo rm -rf /opt/nextcloud/*where sudo(그리고 rm)는 문자 그대로 리터럴과 일치하며 더 /opt/nextcloud/*이상의 *확장은 발생하지 않습니다. 이것은 POSIX 동작입니다. /opt/nextcloud/*분명히 존재하지 않습니다.
  • 또는 일부 상황에서(예: 옵션이 설정된 sudo rm -rfBash에서 ).nullglob

다른 가능성(예: Bash에서 비교)이 있지만 failglob귀하의 경우와 일치하지 않는 것 같습니다.

어쨌든 -f옵션이 rm관련됩니다. 그 뜻은

-f
확인 메시지를 표시하지 않습니다. 파일 피연산자가 없거나 피연산자가 존재하지 않는 경우 진단 메시지를 작성하거나 종료 상태를 수정하지 마십시오. […]

(원천)

실제로 "존재하지 않는 피연산자" 또는 "파일 피연산자 없음"을 제공했으므로 명령은 아무 작업도 수행하지 않고 자동으로 성공했습니다.


내 가설은 /opt/nextcloud/*일반 사용자가 /opt/nextcloud/. 또 다른 가능성은 오타를 냈는데 /opt/nextcloud/*오류 메시지가 없었기 때문에 이를 발견하지 못했다는 것입니다. 이것이 작동하는 방식이므로 오류 메시지가 없습니다 rm -f.

sudo ls /opt/nextcloud/쉘에 의한 확장이 필요하지 않습니다. 명령은 ls루트로 실행됩니다. 자체적 ls으로 지정된 디렉터리와 해당 콘텐츠에 대한 액세스 권한이 있으므로 작동했습니다.

sudo su -루트로 실행되는 쉘에 들어간 후 . 이 쉘은 확장이 가능하므로 /opt/nextcloud/*예상 rm -rf /opt/nextcloud/*한 대로 작동했습니다.

관련 정보