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
ln
Linux에서 GNU 구현이 사용되는 것처럼 보입니다 .stat()
함수는 대상이 존재하는지 여부를 결정합니다. 이 함수는 기호 링크의 확인이 필요하므로 기존 링크의 대상에 액세스할 수 없는 경우 함수는 EACCESS
("권한 거부")를 반환하고 유틸리티는 실패합니다. 이는 strace
Ubuntu 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 에 대한 심볼릭 링크일 때 ln
GNU처럼 작동합니다 .ln
ln
접근성그러나 기존 링크의 대상이 다음인 경우 링크는 연결 해제되고 요청 시 심볼릭 링크가 다시 생성됩니다.아니요얻기 쉬운. 즉, 계속하기로 선택합니다(표준 텍스트에서는 허용됨).
또한 ln
OpenBSD의 GNU는 OpenBSD 네이티브와 유사하게 동작하는데 ln
, 이는 다소 흥미롭습니다.
기존 심볼릭 링크를 제거하는 것은 rm
해당 디렉토리에 대한 쓰기 및 실행 권한이 있는 것으로 나타나므로 문제가 되지 않습니다.