更改符号链接的权限

更改符号链接的权限

我有一个具有这些权限的符号链接:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

该符号链接位于 .tar.gz 存档中。现在,当我使用 maven 解压 tar.gz 存档时,符号链接不再有效。因此,我正在尝试重建符号链接。首先我使用创建符号链接但如何设置与原始符号链接相同的权限?

答案1

您可以创建一个新的符号链接并将其移动到旧链接的位置。

ln -s <new_location> npm2
mv -f npm2 npm

这将保留链接所有权。或者,您可以手动chown设置链接的所有权。

chown -h myuser:myuser npm

在大多数系统上,符号链接权限并不重要。使用符号链接时,将检查符号链接目标组件的权限。然而,在某些系统上它们确实很重要。 MacOS 需要对 的链接具有读权限readlink,而 NetBSD 的symperm挂载选项强制对读和遍历进行链接权限检查。在这些系统(及其相关系统,包括 FreeBSD 和 OpenBSD)上,有一个-hchmod.

chmod -h 777 npm

答案2

当您尝试使用chmod设置链接的权限时,实际上您所做的是设置链接目标的权限。链接的权限是没有意义的。

答案3

当您有如下链接时:

link -> foo/bar

并想将其更改为:

link -> new/target

有两种情况需要考虑:

  1. foo/bar不是目录或不存在,或者您没有 的搜索权限foo。然后

    ln -s new/target link
    

    将会失败,因为link已经存在,但是您可以通过使用标准来克服这个问题:

    ln -fs new/target link
    
  2. foo/bar是一个目录(并且您具有能够foo确定这foo/bar是一个目录的搜索权限)。在这种情况下,当您执行以下操作时:

    ln -s new/target link
    

    或者

    ln -fs new/target link
    

    这可以理解为在目录target内创建一个新的符号链接linklink是一个目录,因为它是目录的符号链接foo/bar)。所以你实际上会创建一个:

    foo/bar/target -> new/target
    

    为了克服这个问题,GNUln有一个-T选项,让链接名称始终被视为链接名称,而不是创建链接的目录。因此,对于 GNU ln

    ln -fsT new/target link
    

    将工作。和以前一样,它将删除原始link符号链接并重新创建它new/target作为目标(进程的 euid 和egid 作为所有者)。

    GNUln也有一个-n选择。它的工作原理-T与除了当link实际上是一个真实目录时不同,在这种情况下它仍然会在该目录内创建符号链接(而不是因错误而失败)。

    可移植的是,您最好的选择是先删除链接,然后重新创建它:

    rm -f link && ln -s new/target link
    

在大多数系统上,符号链接的权限会被忽略,并且通常固定为rwxrwxrwx.

在符号链接权限很重要的系统上(例如 OS/X,您需要符号链接的读取权限才能解析其目标),通常有一种方法可以更改它们(chmod -h在 OS/X 上)。

所有权,虽然像上面一样与大多数系统上符号链接指向的文件的访问无关,t可以与父目录或配额位有一些其他相关性...)并且有一个标准命令可以更改它:

chown -h user[:group] the-link
chgrp -h group the-link

答案4

如果您确实需要更改符号链接权限(通常毫无意义,如其他答案中所写),我成功地使用了-R以下选项chown

chown -R myuser:mygroup link

如果-R未使用,则权限不会更改。

相关内容