2

我正在尝试将createFile与派生自"rw-rw-rw-". 我的文件是"rw-rw-r--"在 Fedora 上创建的。

创建文件时如何设置 OTHERS_WRITE?

例子:

(->> "rw-rw-rw-"
     PosixFilePermissions/fromString
     PosixFilePermissions/asFileAttribute
     vector
     into-array
     (Files/createFile (Paths/get "temp" (into-array String []))))
;;; temp is created as rw-rw-r--
4

1 回答 1

3

在类 Unix 系统中,每个进程都有一个名为umask的属性,该属性被屏蔽到由子进程创建和继承的任何文件的权限上。默认是0002或“关闭为他人写”。因此,Java 很可能正在设置您寻求的权限,然后将其屏蔽掉您可以在创建文件后显式设置权限或在启动之前更改 java 进程的 umask 设置。

首先让我们看一下当前的umask:

arthur@a:/tmp$ umask
0002

然后让我们为每个人创建一个可以读写的文件(touch 和你的 java 代码一样)

arthur@a:/tmp$ touch foo
arthur@a:/tmp$ ls -l foo
-rw-rw-r-- 1 arthur arthur 0 Aug 28 13:58 foo

我们看到八进制0002已被实际文件权限屏蔽。
所以我们可以通过将它设置为 0000 来移除这个 umask:

arthur@a:/tmp$ umask 0000
arthur@a:/tmp$ touch foo

我们看到 foo 在更新时保持原样,因为 umasks 仅适用于文件。并使用 read-other 权限创建一个新的文件栏。

arthur@a:/tmp$ ls -l foo
-rw-rw-r-- 1 arthur arthur 0 Aug 28 14:00 foo
arthur@a:/tmp$ touch bar
arthur@a:/tmp$ ls -l bar
-rw-rw-rw- 1 arthur arthur 0 Aug 28 14:00 bar

我习惯于在 Java 中创建文件后显式设置权限,因为这更容易从系统传递到系统* 您可以通过在运行 emacs/your-program 之前在 shell 中设置 umask 并检查来证明这一点之后的文件权限。

*Java 是“一次编写,随处运行”对吧?

于 2014-08-28T21:01:26.643 回答