기본 비유: 디렉터리는 폴더가 아닙니다.

기본 비유: 디렉터리는 폴더가 아닙니다.

root다음 권한을 사용하여 /etc/passwd 파일을 홈 디렉터리에 복사할 수 있습니다.

-rw-r--r--. 1 root root 2751 Dec 24 21:26 /etc/passwd

나는 같은 일을 할 수 없습니다:

-rw-------. 1 root root 43591 Dec 27 18:32 /var/log/messages

그럼 읽기 권한이 있으면 others복사가 가능해질 것 같은데요?

하드 링크를 생성하기 위해 홈 디렉토리에 루트 사용자로 file1을 생성하고 일반 사용자로 하드 링크를 생성하려고 했습니다. 나는 그것을하지 못했습니다.

-rw-r--r--. 1 root root 0 Dec 27 18:39 file1

하드 링크가 생성되는 것을 방지하는 것은 무엇입니까?

file1이 위치한 디렉터리의 권한은 다음과 같습니다. drwx------. 18 student student 4096 Dec 27 18:42 .

file1의 이름을 file2로 바꿀 수 있었으므로 복사와 마찬가지로 읽기 권한으로 인해 others이런 일이 발생하는 것 같습니다.

마지막으로 file2를 다른 위치로 이동할 수 없습니다. 왜?

편집: 하드 링크 권한을 설명하는 질문을 보았지만 다른 사용자의 파일 및 디렉터리를 복사하고 이동하고 이름을 바꾸는 데 어떤 권한이 필요한지 이해하지 못합니다.

답변1

기본 비유: 디렉터리는 폴더가 아닙니다.

이해해야 할 기본 개념은목차. 이것이 중요합니다: 유닉스는 그렇습니다아니요가지다폴더,그것은목차.

이러한 구별은 중요합니다. 폴더포함하다물건. 디렉토리목록물건. 폴더를 생각하면 잘못된 비유가 떠오릅니다. 사무실 건물 로비에 있는 회사 디렉토리를 생각해 보십시오. 이 디렉토리는 회사 디렉토리가 아닙니다.포함하다사무실 그것목록그들을. 마찬가지로, 전화번호부도 마찬가지입니다.포함하다네 친구야목록그들을. 반면에 (물리적) 폴더는 실제로포함되어 있습니다저장되는 (물리적) 파일입니다.

파일 일련번호

Unix에서는 파일에 이름이 없습니다. 파일이 하나뿐입니다파일 일련 번호(FSN). FSN은 단일 파일 시스템 내에서 고유합니다. 동일한 파일 시스템의 두 파일은 동일한 FSN을 갖지 않으며 단일 파일은 수명 동안 단일 FSN만 갖습니다. 하지만 파일 위치는 다음과 같습니다.다른파일 시스템은 동일한 FSN을 가질 수 있습니다.

인덱스 노드

참고: 이 용어를 접할 수도 있습니다.인덱스 노드. 본질적으로 같은 의미입니다.파일 일련번호Unix 표준화를 위해 고안된 이름입니다.인덱스 노드실제로 일부 파일 시스템의 구현 세부 사항이지만 많은 최신 파일 시스템에는 이러한 기능이 없습니다.가지다inode는 더 이상 존재하지 않지만 여전히 FSN이 필요합니다. 또한 많은 최신 Unices에서는 분명히 inode가 없는 외부 파일 시스템 마운트를 허용합니다. 이는 순전히 Unix의 일이기 때문입니다(예: Linux에서 FAT, exFAT 또는 NTFS 파일 시스템 마운트). 그러나 많은 파일 시스템 API가 FSN을 기반으로 하기 때문에 이러한 외부 파일 시스템용 Unix 드라이버는 여전히 FSN을 합성해야 합니다.

목차

목차특수 파일그 동료이름도착하다FSN. 매우 초기의 매우 단순한 Unix 파일 시스템에서 디렉토리는 실제로 다음과 같은 파일(텍스트 파일과 유사)이었습니다.

12345 foo
54321 hello.txt
34343 My 2021 taxes.xlsx

물론 최신 파일 시스템은 훨씬 더 복잡하지만개념적으로, 이는 오늘날 가장 복잡한 파일 시스템에서도 여전히 작동하는 방식입니다.

세 가지 기본 개념

이 세 가지 개념을 이해했다면 Unix 파일 시스템과 Unix 권한에 대해 알아야 할 모든 것을 알게 된 것입니다.

  • 파일에는 이름이 없고 파일 일련 번호만 있습니다.
  • 디렉터리는 파일입니다.
  • 디렉터리는 이름을 FSN과 연결합니다.

우리의 전화 시스템이 어떻게 작동하는지 생각해 보세요. 우리에게는 숫자만 있습니다.목차(전화번호부, 전화번호부 또는 더 현대적으로는 휴대폰의 연락처 앱) 이름을 이 번호와 연결합니다.

(하드) 링크

사이의 연관이름그리고FSN라고협회아니면 가끔하드 링크(심볼릭 링크/소프트 링크와 혼동될 가능성이 있는 경우)

세 가지 기본 개념의 결과

이 세 가지 개념을 내면화하면 다른 모든 것이 제자리에 있어야 합니다.

이제 다른 디렉토리나 심지어 동일한 디렉토리에 동일한 FSN에 대해 여러 개의 이름→FSN 링크를 생성하는 것을 막을 수 있는 방법이 없다는 것이 분명해졌습니다. 즉, 동일한 파일이 여러 이름을 가질 수 있고 여러 경로에 존재할 수 있습니다.

분명히 이로 인해 계층적 디렉터리 구조가 발생합니다. 디렉터리는 다른 파일과 마찬가지로 파일일 뿐이므로 다른 파일과 마찬가지로 FSN이 있으므로 디렉터리 내의 디렉터리를 나열할 수 있습니다.

명확하지는 않지만 rm이 유틸리티를 이해하는 것이 매우 중요합니다.아니요실제로 하나 삭제문서! 그것은 삭제합니다협회, 즉, 디렉토리의 항목을 삭제합니다. 사용된 라이브러리 함수와 커널 시스템 호출은 rm실제로 호출됩니다 unlink. 사실 당신은할 수 없다실제로 Unix에서 파일을 삭제합니다. 파일에 대한 링크가 없고(즉, 파일 이름이 0개인 경우) 파일에 열린 파일 핸들이 없으면 파일이 자동으로 삭제됩니다.

이는 또한 많은 Windows 사용자를 혼란스럽게 하는 사항을 설명합니다. 일부 응용 프로그램에 아직 열려 있는 파일을 어떻게 삭제할 수 있습니까? 앱이 어떻게 충돌하지 않나요? 글쎄요, 이전 단락에서 배운 내용을 바탕으로 대답은 간단합니다.아니요삭제문서, 삭제만 되었습니다이름. 파일이 아직 존재합니다. 다른 이름을 가질 수도 있지만 이것이 성이라 할지라도 응용 프로그램이 파일을 닫을 때까지 파일은 삭제되지 않습니다. 실제로 임시 파일을 만들고 연 다음 즉시 다시 "삭제"하는 것은 데이터를 임시로 저장해야 하지만 파일 시스템을 임시 파일로 복잡하게 만들고 싶지 않은 Unix 응용 프로그램의 일반적인 디자인 패턴입니다.

권한에 개념 적용

디렉터리가 파일이고 디렉터리가 이름과 숫자를 연결한다는 점을 이해하면 권한이 명확해집니다.

  • 네가 원한다면이름을 바꿔라, 당신은해야쓰다디렉터리의 새 이름을 지정하고 삭제합니다(이 역시 형식입니다.글쓰기) 오래되었으므로 w의식 라이센스가 필요합니다디렉토리로, 하지만파일에 액세스할 수 없습니다.. 실제로 이름 바꾸기는 실제로 파일 자체와 관련이 없습니다.이름이것은아니요파일 자체의 속성입니다.
  • 필요한 디렉토리를 나열하려면읽다내용이 있으므로 r디렉토리에 대한 읽기 권한이 필요합니다.
  • 하드 링크를 만드는 것은 단지글쓰기디렉터리이므로 w해당 디렉터리에 대한 쓰기 권한이 필요합니다. 등.

구체적인 예

세 가지 핵심 개념을 고려하면 다음과 같은 모든 질문에 답할 수 있습니다.

복사

/etc/passwd다음 권한을 사용하여 소유한 파일을 홈 디렉터리에 복사 할 수 있습니다 .root

-rw-r--r--. 1 root root 2751 Dec 24 21:26 /etc/passwd

나는 같은 일을 할 수 없습니다:

-rw-------. 1 root root 43591 Dec 27 18:32 /var/log/messages

그럼 읽기 권한이 있으면 others복사가 가능해질 것 같은데요?

좋아요. 실제로 "파일 복사"가 무엇인지 생각해 보세요.의미는: 누구세요만들다새로운파일(이것은 자동으로 이름을 지정해야 함을 의미합니다.협회대상 디렉토리의 항목), 다음을 포함합니다.동일한 콘텐츠원본 파일로.

이렇게 하려면 두 가지 권한이 필요합니다.

  • w새로 생성된 파일에 대한 하드 링크를 생성하려면 대상 디렉터리에 대한 라이트 권한이 필요합니다 .
  • 내용을 읽으려면 원본 파일에 대한 ead 권한이 필요합니다 r. 내용을 읽을 수 없는 경우 어떻게 다시 만들 수 있습니까?

협회

하드링크를 생성하기 위해 file1홈디렉토리에 루트 사용자를 생성하고 일반 사용자로 하드링크를 생성해 보았습니다. 나는 그것을하지 못했습니다.

-rw-r--r--. 1 root    root       0 Dec 27 18:39 file1

하드 링크 생성을 방해하는 표준 Unix 권한 모델에는 아무 것도 없습니다. 필요한 것은 w디렉터리에 대한 의식 권한뿐입니다. 파일을 건드릴 필요가 없으므로 파일에 대한 권한은 관련이 없습니다.

방금 내 OS(macOS 12.1 "Monterey")의 APFS 파일 시스템에서 이것을 테스트했는데 훌륭하게 작동합니다.

fs.protected_hardlinks

하드 링크가 생성되는 것을 방지하는 것은 무엇입니까?

Unix 권한 시스템에는 아무것도 없습니다. 그러나 Linux를 사용하고 있으므로 이 작업을 수행하지 못하게 할 수 있는 Linux 관련 구성 옵션인 sysctl이 있습니다 fs.protected_hardlinks.

에서 인용공식 sysctl 문서[용감한강조 광산]:

보호된 하드 링크

[…]

" "로 설정하면 0하드 링크 생성 동작이 제한되지 않습니다.

1" " 으로 설정한 경우사용자가 소스 파일을 아직 소유하지 않거나 소스 파일에 대한 읽기/쓰기 액세스 권한이 없는 경우 하드 링크를 생성할 수 없습니다..

(제한됨) 으로 설정하신 것 같습니다 1. /proc/sys/fs/protected_hardlinks확실하게 확인하세요 .

이름을 바꿔라

file1이 위치한 디렉터리의 권한은 다음과 같습니다.

 drwx------. 18 student student 4096 Dec 27 18:42 .

file1이름을 로 바꿀 수 있었 file2으니 복사본과 마찬가지로 읽기 권한으로 others인해 이런 일이 발생하는 것 같습니다.

하나를 위해이름을 바꿔라w, 소유한 디렉터리에 대한 라이트 권한 만 필요합니다 . 파일의 내용을 절대 건드리지 않으므로 해당 권한은 중요하지 않습니다.

이동하다

결국 file2다른 곳으로 이동할 수 없게 되었습니다. 왜?

무엇에 따라 다르죠,정확히, "이동"이 무슨 뜻인가요?정확히, '다른 위치'를 의미하시나요? 그리고 무엇을 말씀하시나요?정확히"할 수 없다"는 뜻입니다.

"이동"을 해석하는 방법에는 두 가지가 있습니다.

  1. 원본 콘텐츠를 삭제하고 동일한 콘텐츠를 다른 이름으로 다시 생성하세요.
  2. 소스 디렉터리의 링크를 제거하고 대상 디렉터리에 링크를 생성합니다.

유틸리티를 사용하면 mv실제로 이러한 작업을 모두 수행할 수 있으므로 살펴보겠습니다.

#2 이름 바꾸기: w링크를 삭제하려면 소스 디렉터리에 대한 라이트 권한이 필요하고, w링크를 생성하려면 대상 디렉터리에 대한 라이트 권한이 필요합니다. 파일을 만지거나 해당 콘텐츠에 액세스할 필요가 전혀 없으므로 권한은 중요하지 않습니다. 실제로 mv이를 위해 시스템 호출이 사용됩니다.rename

mv가능할 때마다 #2를 해보세요.

그럼 2위는 언제야?아니요가능한? 글쎄요, FSN이 유일한 것임을 기억하세요파일 시스템 내에서. 반품,문서오직 존재한다파일 시스템 내에서.

따라서 #2는 소스 디렉터리와 대상 디렉터리가 동일한 경우에만 가능하다는 점을 분명히 해야 합니다.동일한 파일 시스템에서. 서로 다른 파일 시스템에 있는 mv경우복사파일을 대상으로 복사한 다음 원본 파일의 링크를 해제합니다. 이는 위에서 설명한 대로 w소스 디렉터리에 대한 rite 액세스와 대상 디렉터리에 대한 rite 액세스 외에도 원본 파일에 대한 ead 액세스 w도 필요하다는 것을 의미합니다.r

실행 권한

r참고: 지금까지는 ead 및 rite 권한 만 살펴봤지만 eecute 권한은 w완전히 무시했습니다 .x

...일반 ​​파일의 경우

일반 파일의 경우 ecute x권한은 매우 명확합니다. 즉, 파일을 실행할 수 있는 권한을 부여합니다. (아니요, 정말요?) 그러나 여기에서 "실행"은 특정한 의미를 가지고 있습니다. "실행을 위해 커널에 전달"을 의미합니다.

특히 당신은아니요x파일을 스크립트 해석기로 전달하려면 실행 권한이 필요합니다 . 따라서 다음과 같이 MyLanguage라는 가상 언어로 호출되는 스크립트 파일이 있는 경우 myscript:

#!/usr/bin/env mylanguage

print "Hello, World!"

그럼 당신은하다x다음과 같이 실행하려면 ecute 권한이 필요합니다.

/path/to/myscript

하지만 당신은 그랬어요아니요x다음과 같이 실행하려면 ecute 권한이 필요합니다.

mylanguage /path/to/myscript

언어 해석기는 r스크립트 파일의 내용을 읽으려면 읽기 권한만 필요합니다.

혹은 좀 더 정확하게 말하자면,체계x전자 허가를 받을 필요는 없으나 mylanguage통역사가 필요하며,할 수 있다x, 필요한 경우 ecute 권한이 있는지 확인하세요 . 실제로 일부 통역사는 이를 수행하고 일부는 그렇지 않습니다.

...디렉토리용

x디렉토리에 대한 ecute 권한은 무엇을 의미합니까 ? 여기서는 무엇이 실행되고 있습니까?

디렉터리의 경우 xecute 권한은 "입력" 권한 또는 "찾기" 권한으로 해석됩니다. 즉, 전자 xecute 권한을 사용하면 디렉터리에서 FSN(이름 지정)을 요청할 수 있습니다.

디렉토리는 다음을 수행하는 매우 간단한 프로그램으로 생각할 수 있습니다.이름매개변수로 사용하고 반환FSN, 그렇다면 "e ecute Permission"이라는 아이디어가 x의미가 있습니다. 그러나 그것은 정말 힘든 생각이다. ecute가 디렉토리의 " 찾기" 또는 "입력"을 의미한다는 x사실을 무시하세요 .xx

다른 유형의 특수 파일

디렉토리는 유일한 특수 파일 유형이 아닙니다. 다른 다섯 가지가 있습니다:

  • 심볼릭 링크,
  • 관로,
  • 소켓,
  • 캐릭터 특수 파일, 그리고
  • 특수 파일 차단.

심볼릭 링크

이 다섯 가지 중 가장 흔히 접하게 되는 것은 다음과 같습니다.심볼릭 링크또는심볼릭 링크.

심볼릭 링크는 기본적으로 다음을 포함합니다.. 초기의 매우 단순한 Unix 파일 시스템에서 심볼릭 링크는 실제로 경로가 포함된 텍스트 파일이었습니다. 그것은 오늘날에도 여전히 당신이 보는 방식과 비슷합니다.

이것을 이해하고 나면 어딘가에 대한 심볼릭 링크를 생성하려면 파일을 생성하기만 하면 된다는 것이 분명해집니다. 파일에 입력한 경로에 액세스할 필요는 없습니다. 사실 도로가 존재할 필요도 없습니다!

예를 들어, 파일을 생성할 수 있다고 가정하면 쉽게 할 수 있습니다.

ln -s https://www.google.com/ google

완벽하게 유효한 심볼릭 링크입니다. google완벽하게 유효한 이름이고 완벽하게 유효한 경로입니다("현재 디렉터리에 지정된 디렉터리에 지정된 디렉터리 https://www.google.com/"를 의미함). 그러나 확실히 존재하는 실제 파일을 가리키지는 않습니다. , 비록 당신이www.google.comhttps:할 수 있다하다

mkdir -p https:/www.google.com

원한다면 다음과 같이 어딘가를 가리키도록 할 수 있습니다.

cd google
# no error

답변2

그렇다면 다른 사람의 읽기 권한이 있으면 복사가 가능할까요?

파일을 복사하는 것은 단순히 파일 내용을 읽고, 새 파일을 만들고, 데이터를 쓰는 것입니다. 원본 파일에 대한 읽기 권한이 필요하고, 새 파일을 생성하려면 새 파일의 디렉터리에 대한 쓰기 권한이 필요합니다. 바라보다비트를 실행하고 읽습니다. Linux에서 디렉토리 권한은 어떻게 작동합니까?

하드 링크가 생성되는 것을 방지하는 것은 무엇입니까?

아마fs.protected_hardlinks sysctl이 언급되었을 것입니다.하드 링크 생성 - 권한?. 설정된 경우 하드 링크는 사용자가 파일을 소유하거나 파일에 대한 읽기 및 쓰기 액세스 권한과 새로 연결된 디렉터리에 대한 쓰기 액세스 권한이 있는 경우에만 생성될 수 있습니다. 설정하지 않으면 새로 연결된 디렉터리에 대한 쓰기 권한만 필요합니다.

심볼릭 링크에는 비슷한 손잡이가 있습니다 fs.protected_hardlinks. 둘 다 권한이 없는 프로세스에 의해 수정될 수 있는 다양한 취약점을 따르는 것을 방지하기 위한 것입니다./tmp . 두에 설명된proc(5) 매뉴얼 페이지.

의견에서 언급했듯이 대부분의 일반적인 Linux 배포판에서는 심볼릭 링크/하드 링크 보호가 기본적으로 활성화되어 있을 것입니다.

file1의 이름을 file2로 바꿀 수 있었으므로 복사와 마찬가지로 다른 사람의 읽기 권한으로 인해 이런 일이 발생하는 것 같습니다.

마지막으로 file2를 다른 위치로 이동할 수 없습니다. 왜?

단일 파일 시스템 내에서 파일을 이동하는 것은 이름을 바꾸는 것과 같습니다. 이전 디렉터리와 새 디렉터리 모두에 대한 쓰기 권한이 필요하며, 이동하는 경우목차, 디렉토리 자체에 대한 쓰기 권한. (파일 시스템 간에 파일을 "이동"하려면 새 파일을 만들고, 내용을 복사하고, 원본 파일을 삭제해야 합니다.)rename()시스템 호출 매뉴얼 페이지EACCES 및 EPERM 오류 설명에 최소한 몇 가지 요구 사항을 설명하세요.

여기서 공통된 주제는 디렉토리의 데이터가 다음과 같다는 것입니다.파일 이름, (또는 "하드" 링크)는 실제를 설명하는 inode를 가리킵니다.문서. 디렉토리의 액세스 권한은 이 데이터에 대한 액세스를 제어하므로 파일 이름을 변경합니다. 따라서 파일을 생성, 삭제, 이동하고 이름을 바꾸려면 영향을 받는 파일 이름이 포함된 디렉터리에 대한 쓰기 권한이 필요합니다.

x모든 경우에 영향을 받는 파일/파일 이름 경로의 모든 디렉터리에 대한 검색/액세스 권한(비트)도 필요합니다. (바라보다path_resolution(7))

답변3

하드 링크는 파일 저장소에 연결되어 있으며 동일한 inode를 갖습니다. 따라서 "다른 사람"이 쓰기 액세스 권한을 갖지 않는 한 하드 링크할 수 없습니다.

파일 권한이 646이면 파일에 하드 링크할 수 있습니다. 마지막으로 하드링크와 원본 파일의 ls -i 파일명을 입력합니다. 동일한 인덱스 노드가 있음을 알 수 있습니다.

관련 정보