如何更改符号链接权限?

如何更改符号链接权限?

我有一个问题:我需要将符号链接的权限从 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 和自由BSD, 使用-h

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

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

    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。 GNU coreutils(如 BSD)支持更改符号链接所有权的能力。这是一个不同的功能,因为符号链接的所有权与是否可以修改链接的内容(并将其指向不同的目标)有关。同样,这最初是作为 BSD 功能(OSX、自由BSD等),这也支持Linux(和索拉里斯, ETC)。 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);

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

旗帜由以下列表中的标志按位 OR 构造,定义于<fcntl.h>

AT_SYMLINK_NOFOLLOW
如果小路命名一个符号链接,然后改变该符号链接的模式。

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

fchmodat顺便说一句,它最初似乎是 Solaris 的一项记录很少的功能,十年前被 Red Hat 和 GNU 开发人员采用,并由他们建议进行标准化:

根据Linux 编程接口,从 2.6.16 开始,Linux 支持AT_SYMLINK_NOFOLLOW以下调用:faccessat, fchownat, fstatat,utimensat,并linkat在 2.6.18 中实现(两者都相当“旧”:据 OSNews 报道,2006 年)。

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

答案2

不评估符号链接的权限。

以前,无法更改符号链接的权限位。

一段时间以来,POSIX 的引入fchmodat()以及所有支持此调用的平台都能够更改符号链接的权限位。

不过,不要指望这会对符号链接产生影响。

相关内容