예시 스크립트:
#!/bin/sh -e
sudo useradd -m user_a
sudo useradd -m user_b -g user_a
sudo chmod g+w /home/user_a
set +e
sudo su user_a <<EOF
cd
umask 027
>> file_a
>> file_b
>> file_c
ls -l file_*
EOF
sudo su user_b <<EOF
cd
umask 000
rm -f file_*
ls -l ~user_a/
set -x
mv ~user_a/file_a .
cp ~user_a/file_b .
ln ~user_a/file_c .
set +x
ls -l ~/
EOF
sudo userdel -r user_b
sudo userdel -r user_a
산출:
-rw-r----- 1 user_a user_a 0 Jul 11 12:26 file_a
-rw-r----- 1 user_a user_a 0 Jul 11 12:26 file_b
-rw-r----- 1 user_a user_a 0 Jul 11 12:26 file_c
total 0
-rw-r----- 1 user_a user_a 0 Jul 11 12:26 file_a
-rw-r----- 1 user_a user_a 0 Jul 11 12:26 file_b
-rw-r----- 1 user_a user_a 0 Jul 11 12:26 file_c
+ mv /home/user_a/file_a .
+ cp /home/user_a/file_b .
+ ln /home/user_a/file_c .
ln: failed to create hard link ‘./file_c’ => ‘/home/user_a/file_c’: Operation not permitted
+ set +x
total 0
-rw-r----- 1 user_a user_a 0 Jul 11 12:26 file_a
-rw-r----- 1 user_b user_a 0 Jul 11 12:26 file_b
userdel: user_b mail spool (/var/mail/user_b) not found
userdel: user_a mail spool (/var/mail/user_a) not found
답변1
어떤 시스템을 실행하고 있나요? Linux에서 이 동작은 /proc/sys/fs/protected_hardlinks
(또는 sysctl fs.protected_hardlinks
)을 통해 구성할 수 있습니다.
이 동작은 다음에 설명되어 있습니다.proc(5)
:
/proc/sys/fs/protected_hardlinks
(Linux 3.6부터)
이 파일의 값이 0이면 하드 링크 생성에 제한이 없습니다(즉, 이는 Linux 3.6 이전의 역사적 동작입니다). 이 파일의 값이 1이면 다음 조건 중 하나가 충족되는 경우에만 대상 파일에 대한 하드 링크를 생성할 수 있습니다.
- 호출 프로세스에는 CAP_FOWNER 기능이 있습니다.
- 링크를 생성한 프로세스의 파일 시스템 UID가 대상 파일의 소유자(UID)와 일치합니다.
- 다음 조건이 모두 참입니다.
- 대상은 일반 파일입니다.
- 대상 파일에는 설정된 사용자 ID 모드 비트가 활성화되어 있지 않습니다.
- 대상 파일에는 설정된 그룹 ID와 그룹 실행 모드 비트가 모두 활성화되어 있지 않습니다.
- 호출자는 대상 파일을 읽고 쓸 수 있는 권한을 갖습니다(파일의 권한 마스크를 통해 또는 적절한 기능이 있기 때문에).
그 이유는 다음과 같이 분명해야 합니다.
이 파일의 기본값은 0입니다. 이 값을 1로 설정하면 /tmp와 같이 누구나 쓸 수 있는 디렉터리에서 가장 흔히 발생하는 하드 링크 기반 검사 시간, 사용 시간 경합으로 인해 발생하는 오랜 보안 문제를 방지할 수 있습니다.
Debian 시스템 protected_hardlinks
및 이와 유사한 protected_symlinks
기본 시스템에서는 파일에 대한 쓰기 권한 없이 링크를 설정하면 작동하지 않습니다.
$ ls -ld . ./foo
drwxrwxr-x 2 root itvirta 4096 Jul 11 16:43 ./
-rw-r--r-- 1 root root 4 Jul 11 16:43 ./foo
$ mv foo bar
$ ln bar bar2
ln: failed to create hard link 'bar2' => 'bar': Operation not permitted
0으로 설정하면 protected_hardlinks
제한이 제거됩니다.
# echo 0 > /proc/sys/fs/protected_hardlinks
$ ln bar bar2
$ ls -l bar bar2
-rw-r--r-- 2 root root 4 Jul 11 16:43 bar
-rw-r--r-- 2 root root 4 Jul 11 16:43 bar2
답변2
일반적으로 각 파일에 대한 디렉터리 항목이 있습니다(예외가 있지만 자세히 설명할 필요는 없습니다).
디렉토리 항목은 기본적으로이름 + 번호한 쌍은 파일 이름과 i-번호라는 숫자입니다. "라는 프로젝트입니다.나의 목록, 각 파일의 모든 실제 세부 사항을 포함하는 구조는 다음과 같습니다.아이노드.
i-노드에는 파일 소유자 등에 대한 세부 정보가 포함되어 있습니다. 실제로는 파일 소유자가 "소유"합니다. 필드 중 하나는사용 횟수, 일반적으로 1로 설정됩니다.
하드 링크가 만들어지면 이는 첫 번째 링크와 다르지 않은 또 다른 이름+번호 쌍일 뿐입니다. 이때 사용 횟수는 1씩 증가합니다. 하드 링크(또는 상태가 동일하므로 원래 디렉터리 항목)가 삭제되면 사용 횟수가 1씩 감소합니다. 0에 도달하면 파일이 사라집니다. 여기서 볼 수 있듯이 하드 링크를 생성한다는 것은 i-노드의 소유자가 아니어도 i-노드를 변경할 수 있어야 함을 의미합니다.
이는 UNIX와 심볼릭 링크(또는심볼릭 링크, 때로는 호출됨소프트 링크)을 소개합니다. 이것은이름+이름예, 기본적으로 원본 파일에 별칭을 지정하면 됩니다. i 노드에서는 아무 것도 변경되지 않습니다. 단지 리디렉션일 뿐입니다. 단점은 심볼릭 링크가 사라지거나 존재하지 않는 파일을 가리키게 되는 일 없이 원본 파일을 삭제할 수 있다는 것입니다.
답변3
~에서man 2 link
: "...두 이름 모두 동일한 파일을 참조합니다(따라서 동일한 권한과 소유권을 갖습니다)."
파일 읽기/복사/이동 권한이 있어도 동일한 파일에 대해 서로 다른 권한으로 두 개의 링크를 생성할 수 없습니다.또는소유권모델,UID그리고지드디렉토리 항목 자체가 아닌 두 개의 서로 다른 디렉토리에서 링크를 생성하는 inode에 저장됩니다.
고려하다:
$ touch file_a
$ touch file_b
$ ln file_a file_A
$ ls -iln
total 0
1310731 -rw-rw-r-- 2 1000 1000 0 Jul 11 08:45 file_a
1310731 -rw-rw-r-- 2 1000 1000 0 Jul 11 08:45 file_A
1320710 -rw-rw-r-- 1 1000 1000 0 Jul 11 08:45 file_b
======= ===================================== ======
^ ^ ^
| | \-- names, stored in directory
| \-- file metadata, stored in inode
\-- inode number, stored in directory and pointing to inode
이 예에서는 동일한 inode 번호를 가지 file_a
므로file_A
~ 해야 하다모든 동일한 속성을 inode에 저장합니다.