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

问题描述 投票:24回答:5

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

touch filename.ext
chmod 777 filename.txt

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

shell unix file-permissions ksh
5个回答
31
投票
install -m 777 /dev/null filename.txt

13
投票

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

chmod 777 filename.txt>>!#:2

对于kshzsh,您必须放弃历史扩展(如上所示,可能还有其他方法)并使用:

chmod 644 filename>>filename

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


10
投票

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

使用大多数bash工具安全地创建和更改文件的权限没有一站式方法。甚至Paul's answer中棘手的重定向技巧实际上会在重置它们之前暂时创建一个具有默认权限的文件。除非创建程序在创建节点时向操作系统发送非常具体的请求,否则所有新文件都将使用设置的系统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

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

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

$ (umask 077 ; touch test_file)

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


6
投票

您可以创建自己的命令:

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

create filename.ext 644

2
投票

使用666权限创建文件的唯一原因是umask。所以如果你禁用umask:

umask 0

然后当你触摸文件时,它将自动以权限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
© www.soinside.com 2019 - 2024. All rights reserved.