如何更改符号链接权限?

Joh*_*nPc 8 permissions symlink

我有一个问题:我需要将符号链接的权限从 777 更改为 755,但我不知道该怎么做。我试过使用该chmod命令,但它不起作用。我想要

lrwxrwxrwx  1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0
Run Code Online (Sandbox Code Playgroud)

lrwxr-xr-x 1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0
Run Code Online (Sandbox Code Playgroud)

Tho*_*key 16

有些系统支持更改符号链接的权限,有些则不支持。

  • chmod - 更改文件模式或访问控制列表(OSX 和FreeBSD,使用-h

    -h 如果文件是符号链接,请更改链接本身的模式,而不是链接指向的文件。

  • chmod - 更改文件模式位(Linux)

    chmod从不改变符号链接的权限;chmod 系统调用无法更改其权限。这不是问题,因为符号链接的权限从未使用过。但是,对于命令行上列出的每个符号链接,chmod 会更改指向文件的权限。相比之下,chmod 会忽略递归目录遍历过程中遇到的符号链接。

由于功能不同,POSIX没有提到这种可能性。

从评论中,有人建议最近对 GNU coreutils 的更改提供了该-h选项。目前,它没有出现在chmod源代码中

  而 ((c = getopt_long (argc, argv,
                           ("Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::"
                            "0::1::2::3::4::5::6::7::"),
                           long_options, 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}
};
Run Code Online (Sandbox Code Playgroud)

权限设置为chmod. 所有权设置为chown。GNU coreutils(如 BSD)支持改变符号链接所有权的能力。这是一项不同的功能,因为符号链接的所有权与是否可以修改链接的内容(并将其指向不同的目标)有关。同样,这是作为 BSD 功能(OSX、FreeBSD等)开始的,Linux(和Solaris等)也支持该功能。 POSIX 提到了这个特性

-h
对于命名符号链接类型文件的每个文件操作数,chown 应尝试设置符号链接的用户 ID。如果指定了组 ID,对于命名符号链接类型文件的每个文件操作数,chown 应尝试设置符号链接的组 ID。

命令行工具(和 shell 脚本)到此为止。但是,您可以使用POSIX 的一个功能编写自己的实用程序,该功能在该chmod实用程序的讨论中未提及:

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

后一个函数添加了一个标志参数,其描述如下:

flag 的值由以下列表中的标志的按位包含 OR 构造,在 中定义<fcntl.h>

AT_SYMLINK_NOFOLLOW
如果路径命名一个符号链接,那么符号链接的模式就会改变。

也就是说,目的fchmodat是提供您询问的功能。但是命令行chmod实用程序(到目前为止)仅在chmod(没有此功能)方面进行了记录。

fchmodat顺便说一句,十年前,Red Hat 和 GNU 开发人员采用了 Solaris 的一个文档不足的功能,并且他们建议进行标准化:

根据The Linux Programming Interface,自 2.6.16 起,Linux 支持AT_SYMLINK_NOFOLLOW以下调用:faccessat, fchownat, fstatat, utimensat, 并linkat在 2.6.18 中实现(两者都相当“旧”:2006,据 OSNews 称)。

该功能是否对您有用,取决于您使用的系统。