更改符号链接的权限

u12*_*123 49 chmod symlink

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

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*
Run Code Online (Sandbox Code Playgroud)

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

小智 77

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

ln -s <new_location> npm2
mv -f npm2 npm
Run Code Online (Sandbox Code Playgroud)

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

chown -h myuser:myuser npm
Run Code Online (Sandbox Code Playgroud)

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

chmod -h 777 npm
Run Code Online (Sandbox Code Playgroud)

  • 我被告知“chmod”中不存在“-h”选项! (6认同)
  • 只是提供一个澄清。要更改符号链接的所有权或权限,-h 标志将影响符号链接文件而不是取消引用的文件。 (3认同)
  • 我刚刚在 CentOS 6.8 服务器上遇到了符号链接的权限问题。符号链接的所有者:root 组:root。当所有者和组更改为拥有其所在目录的用户时,如本答案所示,权限问题就消失了。 (2认同)
  • debian 中似乎不存在 `-h` (2认同)

小智 18

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

  • 如果有人更改了指向恶意代码的链接怎么办?原始代码甚至可以是 root 只能访问的东西。例如在 crontap 脚本中。 (3认同)

Sté*_*las 8

当你有一个链接时:

link -> foo/bar
Run Code Online (Sandbox Code Playgroud)

并想将其更改为:

link -> new/target
Run Code Online (Sandbox Code Playgroud)

有两种情况需要考虑:

  1. foo/bar不是目录或不存在,或者您没有对foo. 然后

    ln -s new/target link
    
    Run Code Online (Sandbox Code Playgroud)

    会失败,因为link已经存在,但你可以通过使用标准来克服它:

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

    ln -s new/target link
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    ln -fs new/target link
    
    Run Code Online (Sandbox Code Playgroud)

    这被理解为targetlink目录中创建一个新的符号链接(link是一个目录,因为它是指向该foo/bar目录的符号链接)。所以你实际上会创建一个:

    foo/bar/target -> new/target
    
    Run Code Online (Sandbox Code Playgroud)

    为了克服这个问题,GNUln可以-T选择将链接名称始终视为链接名称,而不是作为在其中创建链接的目录。因此,对于 GNU ln

    ln -fsT new/target link
    
    Run Code Online (Sandbox Code Playgroud)

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

    GNUln也有一个-n选项。它的工作原理类似于-T除非link实际上是一个真正的目录,在这种情况下,它仍然会在该目录中创建符号链接(而不是因错误而失败)。

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

    rm -f link && ln -s new/target link
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

chown -h user[:group] the-link
chgrp -h group the-link
Run Code Online (Sandbox Code Playgroud)