파일 권한은 심볼릭 링크에 어떻게 적용됩니까?


93

이 구조를 가지고 있다고 가정 해 봅시다.

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3file3시스템의 다른 곳 으로 연결되는 링크 입니다.

이제 chmod 777디렉토리와 그 안의 모든 내용을 말씀 드리겠습니다 . 본인 file3/tmp해당 권한을 받습니까? 또한 우리는 같은 상황이지만 반대라고 가정 해 봅시다.

/tmp/file3 -> /directory/file3

링크되는 파일에 대한 권한을 적용하면 링크에 어떤 영향이 있습니까?


권한은 심볼릭 링크가 아닌 파일에만 영향을줍니다.
baraboom 2016 년

답변:


90

전화 방법 chmod및 실행중인 플랫폼 에 따라 다릅니다 .

예를 들어 Linux 시스템에서 다음과 man chmod같이 말합니다.

chmod 심볼릭 링크의 권한을 절대 변경하지 마십시오. chmod 시스템 호출은 자신의 권한을 변경할 수 없습니다. 기호 링크의 권한이 사용되지 않기 때문에 이것은 문제가되지 않습니다. 그러나 명령 행에 나열된 각 기호 링크 chmod에 대해 지정된 파일의 권한이 변경됩니다. 반대로, chmod재귀 디렉토리 탐색 중에 발생한 기호 링크는 무시합니다.

그러나 Mac에서는 chmod를 사용하여 다음과 같은 옵션을 사용하여 기호 링크의 권한을 수정할 수 있습니다 man chmod.

-h 파일이 기호 링크 인 경우 링크가 가리키는 파일이 아닌 링크 자체의 모드를 변경하십시오.

예를 들어,이 답변의 나머지 부분을 Linux 시스템에 있다고 가정하십시오.

첫 번째 경우 chmod -R 777 directory에 권한을 재귀 적으로 변경하기 위해 실행 하는 경우 링크 대상은 영향을받지 않지만 그렇게 할 경우 링크 대상은 영향을받습니다 chmod 777 directory/*.

링크 대상에 대한 권한을 직접 변경하면 해당 권한이 전달됩니다 (Man page 및 baraboom이 말했듯이 실제 링크 권한은 아무 용도로도 사용되지 않으므로).


설명을위한 테스트 로그 :

$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

2
저도 놀랍습니다. 다음 질문 : 심볼릭 링크에 대한 권한은 누가 의미 합니까?
Edward Falk

@EdwardFalk 심볼릭 링크 권한은 모든 것이 링크 된 파일에서 권한을 얻기 위해 통과 할 수 있어야하므로 제한적이지 않습니다.
Walf

5

baraboom 's 및 peth의 답변은 모두 정확합니다. 심볼릭 링크 자체의 권한 비트는 관련이 없으며 (macOS 제외; 아래 참조) 심볼릭 링크의 권한 변경 ( chmod명령 줄 도구 또는 chmod()시스템 호출)은 단순히 다음과 같이 작동합니다. 심볼릭 링크의 대상에 대해 수행 된 경우

symlink () 시스템 호출에 대한 SUSv4 / POSIX.1-2008 설명 을 인용하려면 다음을 수행 하십시오 .

작성된 기호 링크의 파일 모드 비트 값이 지정되지 않았습니다. POSIX.1-2008에 의해 지정된 모든 인터페이스 는 stat 구조 의 st_mode 필드에 리턴 된 파일 모드 비트의 값 이 지정되지 않은 것을 제외하고는 기호 링크의 내용을 항상 읽을 수있는 것처럼 작동 합니다 .

여기서 "지정되지 않은"은 각 구현에 대한 해석의 여지를 남깁니다. 사양 :

  • Linux (ext4fs를 사용하여 테스트) 에서 심볼릭 링크를 만들 때 umask가 무엇이든 관계 없이을 stat()반환합니다 st_mode=0777. ls -l따라서 항상 lrwxrwxrwx심볼릭 링크를 표시 합니다.
  • macOS (HFS) 및 FreeBSD (UFS 및 ZFS)에서 기호 링크에는 자체 권한이 있습니다. chmod -h위에서 언급 한 명령은이 링크 권한 (POSIX 이외의 lchown()시스템 호출을 사용하여이를 달성하기 위해) 및 stat()시스템을 변경할 수 있습니다. call은에 대해이 값을 반환합니다 st_mode.

POSIX에서 지정한대로 Linux 및 FreeBSD의 기호 링크를 항상 따를 수 있습니다. 특히 FreeBSD에서 이는 심볼릭 링크의 파일 모드가 액세스 제어에 전혀 영향을 미치지 않음을 의미합니다.

반면에 macOS는 POSIX를 약간 중단합니다. 읽기 권한에 관계없이 기호 링크를 따를 수 있지만 사용자에게 읽기 권한이 없으면 (Permission denied)로 readlink()실패합니다 EACCES.

$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r--  1 root  staff  1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink

ls: symlink: Permission denied
l---------  1 root  staff  1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye

( -> target두 번째 ls -l명령 의 출력에서 해당 부분이 누락되었으며 사용자에게에 대한 읽기 권한이없는 경우에도 파일 cat symlink의 내용이 성공하여 인쇄 target되었습니다 symlink.)

NetBSD는 symperm명시 적으로 이름 이 지정된 특수 마운트 옵션을 제공 하는데,이 옵션을 설정하면 기호 링크 읽기 / 실행 권한으로 readlink()순회 를 제어 하고 링크 할 수 있습니다.


-1
  1. 링크 파일을 삭제 (프로세스에서 사용하지 않는 것을 확인한 후)
  2. 777-umask = 필수 파일 권한과 같은 방식으로 umask를 설정하십시오.
  3. 링크 파일을 새로 만듭니다

3
이 질문에 어떻게 대답합니까?
jww
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.