单个命令用于创建文件并设置其权限

use*_*776 28 unix shell ksh file-permissions

我使用以下2个命令创建一个0B文件并将其extn设置为644

touch filename.ext
chmod 777 filename.txt
Run Code Online (Sandbox Code Playgroud)

我的问题是unix(korn shell)中是否有任何一个命令可以将这两个东西放在一起,也就是说创建一个具有所需权限的0B fil?

pro*_*ski 34

install -m 777 /dev/null filename.txt
Run Code Online (Sandbox Code Playgroud)

  • 对于目录 => `install -m 700 -d /tmp/mydir` (5认同)
  • 值得注意的是,对于目录,可以使用很好的“mkdir”:“mkdir -m 700 /tmp/mydir”。 (3认同)

Pau*_*ans 13

对于bash,只需使用chmod文件重定向和历史记录扩展:

chmod 777 filename.txt>>!#:2
Run Code Online (Sandbox Code Playgroud)

对于kshzsh你有放弃历史扩展(如上图所示,可能还有其他的方式),并使用:

chmod 644 filename>>filename
Run Code Online (Sandbox Code Playgroud)

对于任何shell的脚本,你没有(并且实际上不需要)历史扩展,所以也可以使用上面的那些.

  • 使用此技巧,在更改之前仍会使用默认 umask 权限创建文件注释。此操作可能会失败(断电、奇怪的 ACL、文件系统问题等)并在系统上留下具有错误权限的文件。这是一行 shell 命令,但由 shell 分两步执行。[设置 umask](/sf/answers/1494073871/) 是确保文件在创建时具有所需权限的正确方法。 (2认同)

Cal*_*leb 10

首先,你永远不应该设置任何777权限.这是一个巨大的安全问题,并没有任何需要.出于这个问题的目的,我假设您要创建一个文件,其权限比默认值更安全600.

使用大多数bash工具安全地创建和更改文件的权限没有一站式方法.即使是Paul的回答中棘手的重定向技巧实际上会在重置它们之前暂时创建一个具有默认权限的文件.除非创建程序在创建节点时向操作系统发送非常具体的请求,否则所有新文件都将使用设置的系统umask值创建.掩码133是常见的,这意味着您的文件是使用644开箱即用的权限创建的.

除了chmod在创建文件后使用命令设置文件权限之外,您还可以使用该umask命令告诉系统您需要什么默认值.

$ umask 077
$ touch test_file
$ ls -l test_file
-rw------- 1 user group 0 Jan 24 22:43 test_file
Run Code Online (Sandbox Code Playgroud)

您将注意到该文件已使用600权限创建.

这将对shell中运行的所有命令保持有效,直到您关闭该shell或手动设置另一个值.如果您想使用此构造来运行单个命令(或者甚至是一小组命令),那么隔离子shell中的命令会很有用

$ (umask 077 ; touch test_file)
Run Code Online (Sandbox Code Playgroud)

请注意,您放入parens中的任何其他内容都将使用该umask,但只要您关闭它,您就会回到以前的环境中.

  • “永远不要将任何内容设置为 777”这意味着什么?我所有网站上 nginx 下的“upload”文件夹感觉很完美 (3认同)

Rob*_*let 6

您可以创建自己的命令:

create () {
    touch "$1"
    chmod "$2" "$1"
}

create filename.ext 644
Run Code Online (Sandbox Code Playgroud)

  • 不不,我认为我无法正确放置查询...它与特定权限或特定文件名无关...并且子例程的内容是我正在使用的片段...我只是想知道是否有一个命令可以一起完成这两件事...就像我们有 mkdir -m 777 dirname 的目录...同样 (2认同)

chi*_*cks 6

您的文件没有立即创建为具有 666 权限的唯一原因是umask. 因此,如果您禁用umask

umask 0
Run Code Online (Sandbox Code Playgroud)

那么当你打开touch该文件时,它会自动以权限 666 结束。通常使文本文件可执行并不是一个好主意。目录最终会获得 777 权限并umask禁用。

chicks@freecandy /tmp $ umask
0022
chicks@freecandy /tmp $ touch x
chicks@freecandy /tmp $ mkdir xx

chicks@freecandy /tmp $ umask 0
chicks@freecandy /tmp $ touch y
chicks@freecandy /tmp $ mkdir yy

chicks@freecandy /tmp $ ls -ld x xx y yy                                                                                  
-rw-r--r-- 1 chicks chicks  484 Jan 24 14:37 x
drwxr-xr-x 2 chicks chicks 4096 Jan 24 14:37 xx
-rw-rw-rw- 1 chicks chicks    0 Jan 24 14:37 y
drwxrwxrwx 2 chicks chicks 4096 Jan 24 14:37 yy
Run Code Online (Sandbox Code Playgroud)


lak*_*tak 5

如果您不仅要创建文件,而且要同时创建内容和模式,您可以install在 bash 中使用进程替换:

install -m 755 <(echo commands go here) newscript
Run Code Online (Sandbox Code Playgroud)

<()将输出放入临时文件(Process-Substitution