파일에 대한 심볼릭 링크를 계산할 수 없습니다.

파일에 대한 심볼릭 링크를 계산할 수 없습니다.

배경 HTML이 심볼릭 링크를 통해 파일에 액세스할 수 없는 방법을 알아내려고 합니다. Apache가 simlink를 통해 지정된 파일 수를 계산/액세스하는 방법을 이해하기 위해 다음과 같은 간단한 실험을 수행했지만 왜 작동하지 않는지 이해할 수 없습니다.

사용자 jzhu로서 저는 vi에서 계산/읽을 수 있기를 원하는 anaconda-ks.cfg 파일을 포함하는 루트 디렉토리의 other라는 디렉토리를 가리키는 홈 디렉토리에 심볼릭 링크를 가지고 있습니다. 그러나 stat 명령을 실행하면 다음과 같은 결과가 나타납니다.

[jzhu@localhost ~]$ stat /home/jzhu/other/anaconda-ks.cfg
stat: cannot stat `/home/jzhu/other/anaconda-ks.cfg': Permission denied

다음은 /home/jzhu/other 심볼릭 링크에 대한 stat 명령입니다. 설정 방법에 대해 더 자세히 이해할 수 있습니다.

[jzhu@localhost ~]$ stat /home/jzhu/other
  File: `/home/jzhu/other' -> `/root/other/'
  Size: 12          Blocks: 0          IO Block: 4096   symbolic link
Device: fd00h/64768d    Inode: 43313       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-11-03 08:52:20.602126433 +0000
Modify: 2013-11-03 08:52:20.187918394 +0000
Change: 2013-11-03 08:52:20.187918394 +0000

lstat의 매뉴얼 페이지를 찾아보면 다음 인용문이 있습니다.

이 함수는 파일에 대한 정보를 반환합니다. 파일 자체에는 권한이 필요하지 않으나, stat(), lstat()의 경우 파일 경로에 있는 모든 디렉터리에 대해 실행(검색) 권한이 필요합니다.

내가 이해한 바로는 stat 명령에는 /root 자체에 대한 실행 권한이 필요하지 않습니다. 왜냐하면 lstat와 달리 이 명령이 실행되는 루트 디렉터리는 실행 중인 현재 디렉터리이기 때문입니다. 이는 "/"의 전체 경로를 사용하지 않음을 의미합니다. root/other/ ", 그러나 "/home/jzhu/other/" 경로가 사용됩니다. strace를 통해 이를 확인했고 다음과 같은 관련 출력이 제공되었습니다.

lstat("/home/jzhu/other/anaconda-ks.cfg", 0x7fff14d5a7c0) = -1 EACCES (Permission denied)

따라서 이 파일의 개수를 계산하려면 /home /home/jzhu 및 /home/jzhu/other에 대한 실행 권한만 있으면 됩니다.

jzhu로서 /home 및 /home/jzhu에 대한 통계를 실행하여 실행 권한이 있는지 확인했습니다. 다음과 같이

[jzhu@localhost ~]$ stat /home/
  File: `/home/'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 2278        Links: 4
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-11-03 08:52:13.797724760 +0000
Modify: 2013-11-04 00:03:45.377150769 +0000
Change: 2013-11-04 00:03:45.377150769 +0000
[jzhu@localhost ~]$ stat /home/jzhu
  File: `/home/jzhu'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 43317       Links: 3
Access: (0700/drwx------)  Uid: (  500/    jzhu)   Gid: (  500/    jzhu)
Access: 2013-11-04 00:00:30.809916040 +0000
Modify: 2013-11-03 23:49:54.781060426 +0000
Change: 2013-11-03 23:49:54.781060426 +0000

하지만 /home/jzhu/other를 jzhu로 계산할 수는 없습니다.

[jzhu@localhost ~]$ stat /home/jzhu/other/
stat: cannot stat `/home/jzhu/other/': Permission denied

또한 다시 변경하고 디렉토리에서 stat를 실행했습니다. 왜 디렉토리를 jzhu로 설정할 수 없는지 혼란스러워요. 아래와 같이 other에는 해당 디렉터리에 대한 읽기 및 실행 권한이 있습니다.

[root@localhost jzhu]# stat /home/jzhu/other/
  File: `/home/jzhu/other/'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 32674       Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-11-03 08:50:36.935318703 +0000
Modify: 2013-11-03 08:50:35.772737444 +0000
Change: 2013-11-03 08:50:35.772737444 +0000
[root@localhost jzhu]# stat /home/jzhu/other/anaconda-ks.cfg 
  File: `/home/jzhu/other/anaconda-ks.cfg'
  Size: 985         Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 43297       Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-11-03 08:50:35.772737444 +0000
Modify: 2013-11-03 08:50:35.781741701 +0000
Change: 2013-11-03 08:54:50.814196796 +0000

그래서 제가 묻고 싶은 질문은 다음 두 가지입니다.

  1. 해당 디렉토리의 다른 항목에 대한 읽기 및 실행 권한이 있음에도 불구하고 /home/jzhu/other/를 stat할 수 없는 이유는 무엇입니까?
  2. anaconda-ks.cfg 파일을 계산할 수 없는 이유는 무엇입니까?

답변1

귀하의 답변은 귀하가 제공한 첫 번째 출력에 있습니다.

$ stat /home/jzhu/other
  File: `/home/jzhu/other' -> `/root/other/'

이는 이것이 /home/jzhu/other기호 링크임을 나타냅니다 /root/other.

/home/jzhu/other/따라서 기본적으로 신체 내부의 모든 항목 에 액세스하려면 액세스가 필요합니다 /root/other. 즉, 사용자는 /root및 에 대한 실행 권한이 있어야 합니다 /root/other.


다음으로 이 명령을 진행해 보겠습니다.

$ stat /home/jzhu/other/
stat: cannot stat `/home/jzhu/other/': Permission denied

위의 작업이 성공하는 동안 이것이 실패하는 이유는 /경로를 사용하는 명령에서 경로의 마지막 구성 요소(예: other)가 심볼릭 링크이고 경로가 후행 으로 끝나는 경우 /해당 경로에 대한 모든 작업입니다. 시스템 호출은 기호 링크를 역참조하고 기호 링크 자체가 아닌 기호 링크가 가리키는 대상을 조작하려고 시도합니다.


해결책:

이에 대한 두 가지 가능한 해결책이 있습니다.

1. 권한 변경 /root/other:

앞에서 언급한 대로 및 에 실행 /root기능을 추가합니다 /root/other. 기본 또는 확장 파일 시스템 속성을 사용하여 이 작업을 수행할 수 있습니다.

  • 사용자를 그룹( ) jzhu에 추가 하고 그룹 실행을 경로( )에 추가 할 수 있습니다 . 이는 해당 그룹으로 제한된 모든 항목에 액세스할 수 있도록 허용하므로 이상적인 솔루션은 아닙니다 .rootusermod -a -G root jzhuchmod g+x /root; chmod g+x /root/other
    root

  • 파일 시스템 ACL을 사용합니다.

    setfacl -mu:jzhu:x /루트
    setfacl -R -mu:jzhu:x /root/others
    setfacl -d -R -mu:jzhu:x /루트/기타
    

    /root/other이를 통해 특정 사용자는 해당 항목과 그 안에 있는 모든 항목에 대한 실행 액세스 권한을 얻을 수 있습니다 .
    이러한 리소스는 공유되고 루트의 홈 디렉터리에 있어서는 안 되기 때문에 여전히 이상적이지 않습니다.

두 솔루션 모두 실행( x) 비트만 부여한다는 점에 유의하세요. 사용자가 해당 디렉터리 내의 항목에 액세스하려면 디렉터리에 실행 비트가 필요합니다. 그러나 r( ) 디렉터리를 나열하려면 ( ) 비트도 읽어야 합니다 ls. 이는 읽기 비트가 없으면 /root/other파일이 어디에 있는지 정확히 알아야 함을 의미합니다 . 읽기를 허용하려면 x마지막 2개의 명령을 (예 : ) setfacl로 변경하면 됩니다 .rx-m u:jzhu:rx

2. 자원을 외부로 이전합니다 /root/other.

이것이 선호되는 솔루션입니다. 에서 심볼릭 링크를 삭제 /home/jzhu/other하고 해당 위치에 디렉터리를 만들거나 시스템의 다른 위치에 있는 공유 위치에 넣을 수 있습니다(무엇인지는 모르지만 좋은 위치를 추천할 수는 없습니다).

이것이 선호되는 솔루션인 이유는 이러한 리소스가 사용자 간에 공유되는 경우 특정 사용자에게 속하지 않으며 해당 사용자의 홈 디렉터리에 있어서는 안 되기 때문입니다.

관련 정보