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.