我有一个具有这些权限的符号链接:
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)
小智 18
当您尝试使用chmod
设置链接的权限时,实际上您所做的是设置链接目标的权限。链接的权限没有意义。
当你有一个链接时:
link -> foo/bar
Run Code Online (Sandbox Code Playgroud)
并想将其更改为:
link -> new/target
Run Code Online (Sandbox Code Playgroud)
有两种情况需要考虑:
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)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)
这被理解为target
在link
目录中创建一个新的符号链接(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)