Прототипом Files.createSymbolicLink()
является:
static Path createSymbolicLink(Path link, Path target,
FileAttribute<?>... attrs)
Ну зачем?
Символьная ссылка - это не что иное, как индексный дескриптор, содержимое которого является строкой, указывающей на... Ну, что угодно. Цель может даже быть недействительной вообще.
Из любопытства я попробовал это (да, он работает как корень, но это здесь специально):
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)
Ну, я как бы ожидал этого.
Единственная ситуация, когда я знаю, где существуют разрешения symlink, - это Linux/proc/*/fd/, поскольку разрешения символической ссылки соответствуют разрешениям, с которыми был открыт дескриптор файла. Но это системная символьная ссылка и не похожа на то, что пользователь может генерировать.
Есть ли какая-либо ОС, где актуал разрешения symlink влияет на поведение символической ссылки и/или ее цели каким-либо образом, формой или формой?
edit: ну, я могу изменить владельца символической ссылки с chown
но... Опять же, какой смысл?
Документы Oracle говорят, что это просто для будущего использования:
Параметр FileAttributes vararg позволяет указать начальные атрибуты файла, которые задаются атомарно при создании ссылки. Однако этот аргумент предназначен для будущего использования и в настоящее время не реализован. (источник, акцент мой)
На 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
для создания такой символической ссылки в будущем.