可以使用在命令行上设置的权限创建文件吗?

quo*_*ian 42 shell permissions files

创建目录时,mkdir -m <mode> <dir>提供使用给定模式/权限集(原子地)创建一个或多个目录。

在命令行上是否有创建文件的等价物?

类似于:

open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);
Run Code Online (Sandbox Code Playgroud)

使用touch后面是chmod我唯一的选择吗?


编辑:在尝试了 teppic 的使用建议后install,我运行了它strace以查看它与原子的接近程度。答案是,不是很:

$ strace install -m 777 /dev/null newfile
...
open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=0, ...}) = 0
...
fchmod(4, 0600)                         = 0
close(4)                                = 0
...
chmod("newfile", 0777)                  = 0
...
Run Code Online (Sandbox Code Playgroud)

尽管如此,这是一个单一的 shell 命令,我以前不知道。

tep*_*pic 54

您可以将install命令(GNU coreutils 的一部分)与虚拟文件一起使用,例如

install -b -m 755 /dev/null newfile
Run Code Online (Sandbox Code Playgroud)

如果该-b选项newfile已存在,则会备份该选项。您也可以使用此命令来设置所有者。

  • +1 向我介绍“安装” (6认同)
  • `install` 不会自动创建具有给定权限的文件。它单独调用“fchmod()”。未经授权的用户可以在创建和权限更改之间打开文件,因此可以稍后读取不允许他们读取的内容(例如私钥文件)。因此,如果文件权限安全很重要,则不应使用“install”。(这已被编辑到问题中,但我认为最好在这个答案下说明它,因为尽管没有满足所要求的“原子”要求,但它目前已被标记为已接受。) (4认同)
  • @Kusalananda 这显然只是如何设置模式的一个例子,因为那是问题,而不是如何设置 755。 (2认同)

Gil*_*il' 24

touch如果文件不存在,则始终创建该文件,始终遵循符号链接,并始终使文件不可执行。您可以通过umask决定读取和写入位。

(umask 077; touch file)  # creates a 600 (rw-------) file
(umask 002; touch file)  # creates a 664 (rw-rw-r--) file
Run Code Online (Sandbox Code Playgroud)

“安全”的原子文件创建(尤其是使用O_NOFOLLOW)是传统的 shell 工具无法实现的。您可以sysopen在 perl 中使用。如果您有 BSD 启发的mktemp实用程序,它会自动创建一个文件O_NOFOLLOWchmod如果 600 的默认模式不是正确的模式,则必须在事后调用。

  • 您可以使用... ln 或mv 原子地创建非空的可执行文件。您始终可以在使用 umask 077 创建的目录中创建具有正确内容和权限的文件,然后将其移动或 ln 它。 (4认同)