更改符号链接的权限


37

我具有以下权限的符号链接:

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

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

Answers:


59

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

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

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

chown -h myuser:myuser npm

在大多数系统上,符号链接权限无关紧要。使用符号链接时,将检查符号链接目标组件的权限。但是,在某些系统上,它们确实很重要。MacOS要求对的链接具有读取权限readlink,而NetBSD的sympermmount选项会强制对读取和遍历进行链接权限检查。在那些系统(及其亲戚,包括FreeBSD和OpenBSD)上,有一个等效的-h选项chmod

chmod -h 777 npm

1
我只是在CentOS 6.8服务器上遇到了符号链接的权限问题。符号链接的所有者:组为root:root。当所有者和组更改为拥有它们所在目录的用户时,如此答案所示,权限问题就消失了。
熬夜者猫

只是提供一个澄清。要更改符号链接的所有权或权利,-h标志将影响符号链接文件而不是取消引用的文件。
UltimaWeapon

12

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


2
如果有人将链接更改为恶意代码怎么办?原始代码甚至可以是root只能访问的代码。例如在crontap脚本中。
aliqandil

@aliqandil通常,用户可以删除并重新创建其具有写访问权的目录中的任何文件。在bash中,对文件test-rw-rw-r-- root root,为rm test我收到提示rm: remove write-protected regular empty file 'test'?的解决方案是将目录中的敏感文件对哪些用户有只读访问。
AnOccasionalCashew

5

当您有如下链接时:

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
    

    这可以理解为targetlink目录内创建一个新的符号链接(link之所以称为目录,是因为它是该目录的符号链接foo/bar)。因此,您实际上将创建一个:

    foo/bar/target -> new/target
    

    为了克服这个问题,GNU ln提供了一个-T选项,即始终将链接名视为链接名,而不是在其中创建链接的目录。因此,使用GNU ln

    ln -fsT new/target link
    

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

    GNU ln也有一个-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

0

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

chown -R myuser:mygroup link

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


这将适用于GNU,chown因为它-R暗示了-P这一点,但是并不能保证,也不能在其他chown实现中使用。更改符号链接所有权的标准方法是使用该-h选项。我刚刚更新了接受的答案,这是不正确的。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.