권한이 괜찮은데 심볼릭 링크를 새 대상으로 업데이트할 때 권한이 거부되는 이유는 무엇입니까?

권한이 괜찮은데 심볼릭 링크를 새 대상으로 업데이트할 때 권한이 거부되는 이유는 무엇입니까?

Linux 시스템(실제로는 컴퓨팅 클러스터)에서 다른 사용자의 폴더를 복사했습니다(그는 적절한 chmod를 사용하여 이 작업을 수행할 수 있는 권한을 나에게 부여했습니다).

폴더에는 액세스할 수 없는 파일에 대한 기호 링크가 포함되어 있습니다. 내가 가지고 있는 것과 동일한 파일의 복사본을 가리키도록 업데이트하고 싶습니다.

그러나 내가 ln -sf이것을 Permission denied사용 하려고 할 때

왜 이런 일이 발생합니까?

링크는 다음과 같습니다.

$ ls -l 50ATC_Rep2.fastq
lrwxrwxrwx 1 bli cifs-BioIT 55 21 nov.  13:45 50ATC_Rep2.fastq -> /pasteur/homes/mmazzuol/Raw_data/CHIP_TEST/BM50.2.fastq

대상에 액세스할 수는 없지만 복사본이 있습니다. 이것이 내가 새로운 목표에 대해 원하는 것입니다:

$ ls -l ../../../raw_data/CHIP_TEST/BM50.2.fastq
-rwxr-xr-x 1 bli cifs-BioIT 4872660831 21 nov.  14:00 ../../../raw_data/CHIP_TEST/BM50.2.fastq

내가 시도하면 이런 일이 발생합니다 ln -sf.

$ ln -sf ../../../raw_data/CHIP_TEST/BM50.2.fastq 50ATC_Rep2.fastq
ln: accessing `50ATC_Rep2.fastq': Permission denied

링크 자체의 권한이 아니라 현재 대상의 권한이 중요한 것 같습니다.

먼저 링크를 삭제한 다음 다시 생성하면 문제를 피할 수 있습니다.

$ rm 50ATC_Rep2.fastq
rm: remove symbolic link `50ATC_Rep2.fastq'? y
$ ln -s ../../../raw_data/CHIP_TEST/BM50.2.fastq 50ATC_Rep2.fastq
$ ls -l 50ATC_Rep2.fastq
lrwxrwxrwx 1 bli cifs-BioIT 40 21 nov.  18:57 50ATC_Rep2.fastq -> ../../../raw_data/CHIP_TEST/BM50.2.fastq

링크를 삭제할 수는 있지만 업데이트할 수는 없는 이유는 무엇입니까?

답변1

lnLinux에서 GNU 구현이 사용되는 것처럼 보입니다 .stat()함수는 대상이 존재하는지 여부를 결정합니다. 이 함수는 기호 링크의 확인이 필요하므로 기존 링크의 대상에 액세스할 수 없는 경우 함수는 EACCESS("권한 거부")를 반환하고 유틸리티는 실패합니다. 이는 straceUbuntu Linux 시스템에서 확인 되었습니다 .

GNU를 ln사용 하자lstat()대신 심볼릭 링크를 확인하지 않으며 -n(비표준) 옵션(GNU가 --no-dereference별칭 으로 추가로 사용함 -n)을 사용하여 호출해야 합니다.

ln -s -n -f ../../../raw_data/CHIP_TEST/BM50.2.fastq 50ATC_Rep2.fastq

독서POSIX 사양ln, 사양에서 정의되지 않거나 지정되지 않은 일부 동작에 대해 GNU가 이 작업을 수행하는지 실제로 알 수는 없지만 ln다음과 같은 사실을 활용할 수 있습니다.

대상 경로가 존재하고 이전 단계에서 생성된 경우명시되지 않은진단 메시지를 표준 오류에 기록해야 하는지 ln, 현재 소스 파일에 대해 아무 작업도 수행하지 않고 나머지 소스 파일을 계속 처리해야 하는지, 아니면 현재 source_file을 계속 처리해야 하는지 여부입니다.

여기서 "지정되지 않은" 비트는 ln적어도 "이전 단계"를 "대상 경로가 심볼릭 링크입니다"로 해석할 수 있도록 허용하는 경우 GNU의 동작에 대한 권한을 부여할 수 있습니다.

이 옵션에 대한 GNU 문서는 -n대상이 객체에 대한 심볼릭 링크인 경우에 중점을 둡니다.목차:

'-n'
'--no-dereference'
     Do not treat the last operand specially when it is a symbolic link
     to a directory.  Instead, treat it as if it were a normal file.

     When the destination is an actual directory (not a symlink to one),
     there is no ambiguity.  The link is created in that directory.  But
     when the specified destination is a symlink to a directory, there
     are two ways to treat the user's request.  'ln' can treat the
     destination just as it would a normal directory and create the link
     in it.  On the other hand, the destination can be viewed as a
     non-directory--as the symlink itself.  In that case, 'ln' must
     delete or backup that symlink before creating the new link.  The
     default is to treat a destination that is a symlink to a directory
     just like a directory.

     This option is weaker than the '--no-target-directory' ('-T')
     option, so it has no effect if both options are given.

대상이 디렉토리에 대한 기호 링크인 경우 GNU의 기본 동작은 ln새 기호 링크를 디렉토리에 배치하는 것입니다(즉, 디렉토리에 대한 링크를 역참조하는 것입니다). 선택적으로 진단 메시지를 내보내고 기존 링크의 대상에 액세스할 수 없으면 실패합니다(표준 텍스트 허용).

반면, OpenBSD(및 아마도 다른 BSD 시스템) 는 대상이 object 에 대한 심볼릭 링크일 때 lnGNU처럼 작동합니다 .lnln접근성그러나 기존 링크의 대상이 다음인 경우 링크는 연결 해제되고 요청 시 심볼릭 링크가 다시 생성됩니다.아니요얻기 쉬운. 즉, 계속하기로 선택합니다(표준 텍스트에서는 허용됨).

또한 lnOpenBSD의 GNU는 OpenBSD 네이티브와 유사하게 동작하는데 ln, 이는 다소 흥미롭습니다.

기존 심볼릭 링크를 제거하는 것은 rm해당 디렉토리에 대한 쓰기 및 실행 권한이 있는 것으로 나타나므로 문제가 되지 않습니다.

관련 정보