我有一个具有这些权限的符号链接:
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)上,有一个-h
与chmod
.
chmod -h 777 npm
答案2
当您尝试使用chmod
设置链接的权限时,实际上您所做的是设置链接目标的权限。链接的权限是没有意义的。
答案3
当您有如下链接时:
link -> foo/bar
并想将其更改为:
link -> new/target
有两种情况需要考虑:
foo/bar
不是目录或不存在,或者您没有 的搜索权限foo
。然后ln -s new/target link
将会失败,因为
link
已经存在,但是您可以通过使用标准来克服这个问题:ln -fs new/target link
foo/bar
是一个目录(并且您具有能够foo
确定这foo/bar
是一个目录的搜索权限)。在这种情况下,当您执行以下操作时:ln -s new/target link
或者
ln -fs new/target link
这可以理解为在目录
target
内创建一个新的符号链接link
(link
是一个目录,因为它是目录的符号链接foo/bar
)。所以你实际上会创建一个:foo/bar/target -> new/target
为了克服这个问题,GNU
ln
有一个-T
选项,让链接名称始终被视为链接名称,而不是创建链接的目录。因此,对于 GNUln
: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
答案4
如果您确实需要更改符号链接权限(通常毫无意义,如其他答案中所写),我成功地使用了-R
以下选项chown
:
chown -R myuser:mygroup link
如果-R
未使用,则权限不会更改。