![如何更改符号链接权限?](https://linux22.com/image/89892/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E6%9D%83%E9%99%90%EF%BC%9F.png)
我有一个问题:我需要将符号链接的权限从 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()
以及所有支持此调用的平台都能够更改符号链接的权限位。
不过,不要指望这会对符号链接产生影响。