Java - 无法创建具有 777 权限的目录(改为具有 775)
Java - unable to create directory with 777 permission (has 775 instead)
我正在尝试创建具有 public 写入权限的目录。为了简化事情,我希望它具有 777
权限。这是我的代码:
private static FileAttribute<Set<PosixFilePermission>> DIR_PERMISSIONS;
static {
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_EXECUTE);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_EXECUTE);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
DIR_PERMISSIONS = PosixFilePermissions.asFileAttribute(perms);
}
private Path ensurePath(LocalDate localDate) throws IOException {
String year = String.valueOf(localDate.getYear());
String month = String.format("%02d", localDate.getMonthValue());
Path path = Paths.get(rootDirectory, year, month);
return Files.createDirectories(path, DIR_PERMISSIONS);
}
使用 rootDirectory=/tmp/data
这应该会创建像 /tmp/data/2016/01
这样的文件夹,每个文件夹都具有 777
权限。相反,文件夹具有 775
权限 (drwxrwxr-x.),因此它们缺少 public 写入权限。为什么它以这种方式工作?也许 JVM 需要特殊的参数才能设置这样的权限?
我的系统是 Fedora 24,app 是标准的 Spring 引导应用程序,由 maven 插件启动。
好吧,这让我很好奇,所以这里是:
Google 导致了这个: ("Java is setting the permission you seek and then it's being masked out.") 然后又回到了 link @OlivierGrégoire原来提供。 umask 是个严厉的情妇。
Spring 启动与此行为无关。下面是一个简单的概念证明。我的默认 umask 是 0002。我的 /tmp 目录最初是空的。
public class Test {
public static void main(String[] args) {
Set<PosixFilePermission> fullPermission = new HashSet<PosixFilePermission>();
fullPermission.add(PosixFilePermission.OWNER_EXECUTE);
fullPermission.add(PosixFilePermission.OWNER_READ);
fullPermission.add(PosixFilePermission.OWNER_WRITE);
fullPermission.add(PosixFilePermission.GROUP_EXECUTE);
fullPermission.add(PosixFilePermission.GROUP_READ);
fullPermission.add(PosixFilePermission.GROUP_WRITE);
fullPermission.add(PosixFilePermission.OTHERS_EXECUTE);
fullPermission.add(PosixFilePermission.OTHERS_READ);
fullPermission.add(PosixFilePermission.OTHERS_WRITE);
Path path = Paths.get("/tmp/data/", "01/26");
try {
Files.createDirectories(path, PosixFilePermissions.asFileAttribute(fullPermission));
outputLS(path);
Files.setPosixFilePermissions(path, fullPermission);
outputLS(path);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void outputLS(Path path) throws IOException {
System.out.println(new java.util.Scanner(Runtime.getRuntime().exec("ls -alt " + path.toAbsolutePath() + "/..").getInputStream()).useDelimiter("\A").next());
}
}
产量:
total 12
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .
drwxrwxr-x 2 jsampson jsampson 4096 Jan 26 21:53 26
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..
total 12
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .
drwxrwxrwx 2 jsampson jsampson 4096 Jan 26 21:53 26
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..
umask 只是负责 all file/directory creation 权限。创建后可以进行更改。
我正在尝试创建具有 public 写入权限的目录。为了简化事情,我希望它具有 777
权限。这是我的代码:
private static FileAttribute<Set<PosixFilePermission>> DIR_PERMISSIONS;
static {
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_EXECUTE);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_EXECUTE);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
DIR_PERMISSIONS = PosixFilePermissions.asFileAttribute(perms);
}
private Path ensurePath(LocalDate localDate) throws IOException {
String year = String.valueOf(localDate.getYear());
String month = String.format("%02d", localDate.getMonthValue());
Path path = Paths.get(rootDirectory, year, month);
return Files.createDirectories(path, DIR_PERMISSIONS);
}
使用 rootDirectory=/tmp/data
这应该会创建像 /tmp/data/2016/01
这样的文件夹,每个文件夹都具有 777
权限。相反,文件夹具有 775
权限 (drwxrwxr-x.),因此它们缺少 public 写入权限。为什么它以这种方式工作?也许 JVM 需要特殊的参数才能设置这样的权限?
我的系统是 Fedora 24,app 是标准的 Spring 引导应用程序,由 maven 插件启动。
好吧,这让我很好奇,所以这里是:
Google 导致了这个: ("Java is setting the permission you seek and then it's being masked out.") 然后又回到了 link @OlivierGrégoire原来提供。 umask 是个严厉的情妇。
Spring 启动与此行为无关。下面是一个简单的概念证明。我的默认 umask 是 0002。我的 /tmp 目录最初是空的。
public class Test {
public static void main(String[] args) {
Set<PosixFilePermission> fullPermission = new HashSet<PosixFilePermission>();
fullPermission.add(PosixFilePermission.OWNER_EXECUTE);
fullPermission.add(PosixFilePermission.OWNER_READ);
fullPermission.add(PosixFilePermission.OWNER_WRITE);
fullPermission.add(PosixFilePermission.GROUP_EXECUTE);
fullPermission.add(PosixFilePermission.GROUP_READ);
fullPermission.add(PosixFilePermission.GROUP_WRITE);
fullPermission.add(PosixFilePermission.OTHERS_EXECUTE);
fullPermission.add(PosixFilePermission.OTHERS_READ);
fullPermission.add(PosixFilePermission.OTHERS_WRITE);
Path path = Paths.get("/tmp/data/", "01/26");
try {
Files.createDirectories(path, PosixFilePermissions.asFileAttribute(fullPermission));
outputLS(path);
Files.setPosixFilePermissions(path, fullPermission);
outputLS(path);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void outputLS(Path path) throws IOException {
System.out.println(new java.util.Scanner(Runtime.getRuntime().exec("ls -alt " + path.toAbsolutePath() + "/..").getInputStream()).useDelimiter("\A").next());
}
}
产量:
total 12
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .
drwxrwxr-x 2 jsampson jsampson 4096 Jan 26 21:53 26
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..
total 12
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .
drwxrwxrwx 2 jsampson jsampson 4096 Jan 26 21:53 26
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..
umask 只是负责 all file/directory creation 权限。创建后可以进行更改。