1

的原型Files.createSymbolicLink()是:

static Path createSymbolicLink(Path link, Path target,
    FileAttribute<?>... attrs)

嗯……为什么?

符号链接只不过是一个 inode,其内容是一个指向...的字符串。目标甚至可能根本无效。

出于好奇,我尝试了这个(是的,它以 root 身份运行,但这是故意的):

root@alustriel:/tmp# cat Test.java
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;

public final class Test {
    public static void main(final String... args) throws IOException {
        final UserPrincipalLookupService lookupService =
                FileSystems.getDefault().getUserPrincipalLookupService();

        final UserPrincipal user = lookupService.lookupPrincipalByName("fge");

        final FileAttribute<UserPrincipal> attr =
                new FileAttribute<UserPrincipal>() {
            @Override
            public String name() {
                return "owner:owner";
            }

            @Override
            public UserPrincipal value() {
                return user;
            }
        };

        final Path target = Paths.get("whocares, I don't exist anyway");
        final Path symlink = Paths.get("/tmp/meh");

        Files.createSymbolicLink(symlink, target, attr);
    }
}
root@alustriel:/tmp# javac Test.java 
root@alustriel:/tmp# java Test
Exception in thread "main" java.lang.UnsupportedOperationException: 'owner:owner' not supported as initial attribute
    at sun.nio.fs.UnixFileModeAttribute.toUnixMode(UnixFileModeAttribute.java:74)
    at sun.nio.fs.UnixFileSystemProvider.createSymbolicLink(UnixFileSystemProvider.java:440)
    at java.nio.file.Files.createSymbolicLink(Files.java:996)
    at Test.main(Test.java:41)

嗯,我有点期待。

我知道符号链接的权限在哪里很重要的唯一情况是在 Linux 的 /proc/*/fd/ 中,因为符号链接的权限与打开文件描述符的权限相匹配。但这是系统生成的符号链接,与用户可以生成的完全不同。

是否存在任何操作系统,其中符号链接的权限实际上会以任何方式、形状或形式影响符号链接和/或其目标的行为?


编辑:好吧,我可以更改符号链接的所有者,chown但是...再次,有什么意义?

4

1 回答 1

2

Oracle 文档说这只是为了将来使用:

FileAttributes 可变参数使您能够指定在创建链接时自动设置的初始文件属性。但是,此参数旨在供将来使用,目前尚未实施。来源;强调我的)

在 Mac 上,权限似乎是可设置的,尽管它们似乎没有太大的影响。我创建了一个只能由 root 读取的文件,以及两个指向它的符号链接:一个世界可读,一个只能由 root 读取。我可以cat使用所有三个文件,但是ls -l当我以我的用户身份运行它时,只列出了世界可读链接的链接目标:

-rwxrwxrwx 1 root  wheel   7 Dec 21 21:32 actual
lrwxrwxrwx 1 root  wheel   6 Dec 21 21:33 link_for_all -> actual
lrwx------ 1 root  wheel   6 Dec 21 21:34 link_for_root

我在行为上找不到任何其他差异,但它是某种东西,所以也许你将来可以createSymbolicLink用来创建这样的符号链接。

于 2014-12-22T02:46:42.640 回答