심볼릭 링크 권한을 변경하는 방법은 무엇입니까?

심볼릭 링크 권한을 변경하는 방법은 무엇입니까?

문제가 있습니다. 심볼릭 링크의 권한을 777에서 755로 변경해야 하는데 어떻게 해야 할지 모르겠습니다. 명령 을 사용해 보았지만 chmod작동하지 않습니다. 제 생각에는

lrwxrwxrwx  1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0

도착하다

lrwxr-xr-x 1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0

답변1

일부 시스템은 심볼릭 링크에 대한 권한 변경을 지원하지만 일부 시스템은 지원하지 않습니다.

  • chmod -- 파일 모드 또는 액세스 제어 목록 변경(OSX 및FreeBSD, 사용 -h)

    -h 파일이 심볼릭 링크인 경우 링크가 가리키는 파일이 아닌 링크 자체의 모드를 변경합니다.

  • chmod - 파일 모드 비트 변경(리눅스)

    chmod심볼릭 링크의 권한은 절대 변경되지 않습니다. chmod 시스템 호출로는 해당 권한을 변경할 수 없습니다. 심볼릭 링크의 권한은 절대 사용되지 않으므로 이는 문제가 되지 않습니다. 그러나 명령줄에 나열된 모든 기호 링크에 대해 chmod는 포인팅 파일에 대한 권한을 변경합니다. 대신 chmod는 재귀 디렉터리 탐색 중에 발견된 기호 링크를 무시합니다.

다양한 기능으로 인해,POSIX이 가능성에 대한 언급은 없습니다.

의견에서 누군가 GNU coreutils의 최근 변경 사항이 이 -h옵션을 제공한다고 제안했습니다. 현재 이 항목은 표시되지 않습니다.chmod의 소스 코드:

  while ((c = getopt_long (argc, argv,
                           ("Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::"
                            "0::1::2::3::4::5::6::7::"),
                           긴 옵션, NULL))

그리고long_options이것이 있다:

static struct option const long_options[] =
{
  {"changes", no_argument, NULL, 'c'},
  {"recursive", no_argument, NULL, 'R'},
  {"no-preserve-root", no_argument, NULL, NO_PRESERVE_ROOT},
  {"preserve-root", no_argument, NULL, PRESERVE_ROOT},
  {"quiet", no_argument, NULL, 'f'},
  {"reference", required_argument, NULL, REFERENCE_FILE_OPTION},
  {"silent", no_argument, NULL, 'f'},
  {"verbose", no_argument, NULL, 'v'},
  {GETOPT_HELP_OPTION_DECL},
  {GETOPT_VERSION_OPTION_DECL},
  {NULL, 0, NULL, 0}
};

권한은 다음과 같이 설정됩니다.chmod. 소유권이 다음으로 설정되었습니다.chown. BSD와 같은 GNU coreutils는 기호 링크의 소유권을 변경하는 기능을 지원합니다. 이는 심볼릭 링크의 소유권이 링크의 내용을 수정할 수 있는지(그리고 다른 대상을 가리킬 수 있는지) 여부와 관련되어 있기 때문에 다른 기능입니다. 다시 말하지만, 이는 원래 BSD 기능(OSX,FreeBSD등), 이것은 또한 지원합니다리눅스(그리고솔라리스, 등). POSIX 라고이것특징:

-h
기호 링크 유형 파일의 이름을 지정하는 각 파일 피연산자에 대해 chown은 기호 링크의 사용자 ID 설정을 시도해야 합니다. 그룹 ID가 지정되면 심볼릭 링크 유형의 파일 이름을 지정하는 각 파일 피연산자에 대해 chown은 심볼릭 링크의 그룹 ID 설정을 시도해야 합니다.

명령줄 도구(및 쉘 스크립트)에 대해서는 이 정도입니다. 그러나 다음을 수행할 수 있습니다.쓰다나만의 유틸리티를 사용하세요POSIX의 특징유틸리티에 대한 논의에서는 언급되지 않았습니다 chmod.

int chmod(const char *path, mode_t mode);
int fchmodat(int fd, const char *path, mode_t mode, int flag);

후자의 함수는배너매개변수는 다음과 같이 설명됩니다.

배너에 정의된 다음 목록에 있는 플래그의 비트별 OR로 구성됩니다 <fcntl.h>.

AT_SYMLINK_NOFOLLOW
만약에심볼릭 링크의 이름을 지정한 다음 심볼릭 링크의 모드를 변경합니다.

즉, 의 목적은 fchmodat귀하가 요청한 기능을 제공하는 것입니다. 그러나 명령줄 chmod유틸리티(지금까지)는 chmod다음에 따른 로그만 기록합니다(이 기능은 없음).

fchmodat덧붙여서, 이는 원래 10년 전 Red Hat과 GNU 개발자가 채택하고 표준화를 위해 제안한 솔라리스의 제대로 문서화되지 않은 기능이었던 것 같습니다.

~에 따르면리눅스 프로그래밍 인터페이스, 2.6.16부터 Linux는 AT_SYMLINK_NOFOLLOW다음 호출을 지원합니다.faccessat, fchownat, fstatat,utimensat, linkat2.6.18에서 구현되었습니다(둘 다 매우 "오래됨":OSNews에 따르면 2006년).

이 기능이 유용한지 여부는 사용 중인 시스템에 따라 다릅니다.

답변2

기호 링크에 대한 권한은 평가되지 않습니다.

이전에는 심볼릭 링크의 권한 비트를 변경할 수 없었습니다.

한동안 POSIX fchmodat()와 이 호출을 지원하는 모든 플랫폼이 도입되면서 심볼릭 링크의 권한 비트가 변경될 수 있었습니다.

그러나 이것이 심볼릭 링크에 영향을 미칠 것이라고 기대하지 마십시오.

관련 정보