Linux에서 사용자가 소유하지 않은 비어 있지 않은 디렉토리를 제거하는 방법은 무엇입니까?


10

"foo"디렉토리가 사용자 A가 소유하고 루트가 소유 한 "bar"디렉토리를 포함하는 경우, 사용자 A는 rmdir"foo"를 사용자 A가 쓸 수 있기 때문에 논리적 인 논리적 디렉토리로 간단히 제거 할 수 있습니다 .

그러나 "bar"디렉토리에 루트 소유의 다른 파일이 포함되어 있으면 디렉토리를 제거 할 수 없습니다. 디렉토리의 파일을 먼저 제거해야하므로 비어 있습니다. 그러나 "bar"자체는 쓰기가 불가능하므로 파일을 제거 할 수 없습니다.

그 주위에 방법이 있습니까? 아니면 왜 필요한지 설득하십시오.

답변:


7

해석 1 : 디렉토리는 파일 시스템의 하위 공간입니다. 하위 디렉토리를 만들어 하위 하위 공간으로 세분화 할 수 있습니다. 디렉토리의 소유자는 foo서브 스페이스 내부의 모든 것을 제어 할 수 있어야합니다 foo/bar, foo/bar/qux

해석 2 : 디렉토리는 파일 시스템의 서브 스페이스입니다. 모든 디렉토리는 상위 디렉토리라고하는 다른 디렉토리에 연결됩니다. 디렉토리의 소유자 foo는 서브 스페이스 내부의 모든 것을 제어 할 수 있습니다. 그러나 서브 디렉토리 foo/bar의 경우 소유자 는 내부에 첨부 할 수는 있지만 첨부 할 수 foo없는지 여부를 제어 bar할 수 있습니다 . 소유자 만 제어 할 수 있습니다.foobarbar

해석에 찬성 한 증거 2 : 앞서 언급했듯이 권한이 작동하는 방식. 또한 일부 Unix 파일 시스템에서는 디렉토리를 둘 이상의 부모에 연결할 수 있습니다.이를 다중 하드 링크라고합니다. (일반적인 파일에는 여러 개의 하드 링크가있는 것이 일반적이지만, 디렉토리가 자체 조부모 N 번 제거 된 루프를 만들 위험 때문에 주로 디렉토리에 대해 권장하지 않거나 금지합니다. 따라서 루트에서 접근 할 수 없습니다 디렉토리는 하드 링크가 0이지만 비어 있지 않은 경우 수행 할 작업의 문제점이 있습니다. 디렉토리가 연결되지 않았으므로 삭제하려고하지만 디렉토리를 사용하여 수행하는 작업 내용?)

해석 1에 유리한 증거 1 : 실제로 디렉토리는 단일 부모를 가지므로 트리 구조를 형성합니다. 그리고 당신은에 액세스 할 수 없습니다 foo/bar/qux당신은 실행 권한을하지 않는 한 foo잘만큼 bar(물론, 액세스 권한을 부여 할 다소 모호한 방법이 있다는 것을 제외하고는 bar액세스 권한을 부여하지 않고이 foo). 따라서 상위 수준이 중요합니다.

보다 실용적인 메모에서 사용자 A는 할 수 있습니다.

mkdir 쓰레기
mv 푸 / 바 쓰레기 /
rmdir foo

1
이것은 훌륭한 답변이지만 (권장) 명백한 불일치가 여전히 나에게 좌절감을 안겨줍니다. 그리고 bar를 쓰레기로 옮기는 실제적인 예는 효과가 있지만, 제거 할 수없는 쓰레기라는 디렉토리가 남아 있습니다. B가 A가 소유하고있는 디렉토리에 A가 제거하고 싶은 것을 붙인 사용자 A와 사용자 B라는 점을 제외하고는 동일한 문제가 있습니다.
Paul Hooper

이것은 좋은 설명이지만, mv문제를 피하기 위해 사용 된 마지막 예제는 Raspbian에서 작동하지 않습니다 (다른 시스템에서는 시도하지 않았습니다). 또한이 문제를 연구 한 결과 mv다른 곳에서 언급 한 솔루션으로 사용되는 것을 보지 못했습니다 . 실제로 사용 권한이 어떻게 작동하는지에 대한 이해를 바탕으로 mv내가 시도했을 때 실패 하는 것이 합리적입니다 . 뭔가 빠졌습니까? 아니면이 기능이 변경 되었습니까? @Gilles @PaulHooper
fvgs

@fvgs 아무것도 변경되지 않았지만 상황에 따라이 권한과 다른 권한이있을 수 있습니다. SF에 요청하면 주제가 아닌 것으로 간주 되므로 서버 오류가 아닌 Unix 및 Linux 에서 새로운 질문을 하고 상황에 대한 모든 세부 정보를 제공하는 것이 좋습니다.
Gilles 'SO- 악의를 멈춰라'

@Gilles 당신이 설명한 행동에 대한 문서, 참조 또는 언급을 알려주 mv시겠습니까? mvbar 디렉토리의 이름을 바꾸는 데 사용할 수 있습니다 . mv현재 디렉토리 외부 또는 다른 디렉토리로 막대를 이동시키지 않는 한 성공을 의미합니다 . 그러나 당신이 준 예제 (디렉토리를 위로 이동)는 나에게 효과적이지 않습니다 (권한이 거부되었습니다). 제시 한 예가 질문에 지정된 것 이외의 특정 조건을 가정합니까?
fvgs

@fvgs 내 예제는 bar디렉토리를 위로 이동하지 않고 소유 한 디렉토리로 이동합니다. garbage같은 파일 시스템의 어느 곳에 나있을 수 있으며 반드시의 형제 일 필요는 없습니다 foo.
Gilles 'SO- 악의를 멈춰라'

0

이를 해결하는 유일한 방법은 상위 디렉토리에서 setgid 또는 setuid를 사용하거나 ACL을 사용하는 것입니다.

다음과 같이 setgid 디렉토리를 설정하십시오.

chmod g+s foo

에 기본 ACL을 설정하십시오.

setfacl -d -R -m g:group:rwx foo

이 경로에서 기본 ACL로 설정됩니다. 이 경로가 포함 된 파일 시스템을 acl 옵션과 함께 마운트해야합니다!

왜 당신이 이것을 원한다고 생각하는지 말해주세요.


글쎄, 문제는 일관성 중 하나입니다. 내가 소유 한 디렉토리에서 다른 사용자가 소유 한 파일 또는 빈 디렉토리를 삭제하는 것을 막을 수있는 것은 없지만 비어 있지 않은 경우 내 디렉토리를 삭제할 수 없습니다.
Alex B

이 경우 제공 한 옵션 중 하나를 사용합니다. 그들은 당신을 위해 잘 작동합니다.
wzzrd

저는 종종 데스크탑에서 여러 계정을 사용합니다 (그 중 하나는 "루트가 아닌 기본"계정). make install루트에서 시작하여 무언가를 만들기 시작할 때 그러한 상황을 얻을 수도 있습니다 .
Vi.

부모 디렉토리의 setgid는 도움이되지 않습니다. 루트로 완료 한 후 and cd ~user && mkdir qqq && touch qqq/qqq로 사용자로부터 qqq를 제거 할 수 없습니다 . chmod g+s .rm -Rf qqq
Vi.

음. 아마도 아마도 umask 문제 일 것입니다. 디렉토리가 775이고 setgid이고 umask가 0002 인 경우 파일은 그룹에 쓰기 가능하므로 제거 할 수 있습니다. 그러나 사실은 umask 0022 (주로 기본값)와 함께 작동하지 않습니다. 말 했어야 했어요 acl 옵션을 테스트 했습니까?
wzzrd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.