Shell 创建文件并设置其权限的单个命令

Shell 创建文件并设置其权限的单个命令,shell,unix,file-permissions,ksh,Shell,Unix,File Permissions,Ksh,我使用以下两个命令创建0B文件并将其extn设置为644 touch filename.ext chmod 777 filename.txt 我的问题是,在unix(korn shell)中是否有任何一个命令可以同时完成这两件事,即创建具有所需权限的0B fil?您可以创建自己的命令: create () { touch "$1" chmod "$2" "$1" } create filename.ext 644 对于bash,只需将chmod与文件重定向和历史扩展一起使用

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

touch filename.ext
chmod 777 filename.txt

我的问题是,在unix(korn shell)中是否有任何一个命令可以同时完成这两件事,即创建具有所需权限的0B fil?

您可以创建自己的命令:

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

create filename.ext 644

对于
bash
,只需将
chmod
与文件重定向和历史扩展一起使用即可:

chmod 777 filename.txt>>!#:2
对于
ksh
zsh
您必须删除历史扩展(如上所示,可能还有其他方法)并使用:


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

创建文件时没有立即使用666权限的唯一原因是umask。因此,如果禁用umask:

umask 0
然后,当您触摸该文件时,它将自动获得权限666。通常让文本文件可执行不是一个好主意。目录将以禁用umask的777权限结束

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

首先,您不应该将任何内容设置为
777
权限。这是一个巨大的安全问题,根本不需要它。出于这个问题的目的,我假设您想要创建一个比默认权限更安全的文件,比如
600

使用大多数bash工具,没有一种一站式方法可以安全地创建和更改文件的权限。即使是中棘手的重定向技巧,实际上也会在重置文件之前立即创建一个具有默认权限的文件。除非创建程序在创建节点时向操作系统发送非常特定的请求,否则所有新文件都会使用设置的system 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,但一旦关闭它,您就回到了以前的环境中。

如果您想创建文件,而不仅仅是空文件,同时创建内容和模式,您可以在bash中使用进程替换
安装

install -m 777 /dev/null filename.txt
install -m 755 <(echo commands go here) newscript

install-m 755
touch filename.ext&&chmod 777$\

$\是最新的参数


但正如其他人所说,由于Docker和Alpine的原因,777不是一个好主意,我想有很多人对在没有bash isms帮助的情况下创建可执行的一行程序感兴趣。安装
非常简单

$ docker build -t temp - <<EOF
FROM alpine
RUN echo "date" | install -m 775 /dev/stdin /bin/now
CMD /bin/now
EOF

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine
 ---> d6e46aa2470d
Step 2/3 : RUN echo "date" | install -m 775 /dev/stdin /bin/now
 ---> Running in 95919b575638
Removing intermediate container 95919b575638
 ---> cd1fafd96ef3
Step 3/3 : CMD /bin/now
 ---> Running in 03b5c3ac7265
Removing intermediate container 03b5c3ac7265
 ---> 8f30b527dd29
Successfully built 8f30b527dd29
Successfully tagged temp:latest

$ docker run --rm temp
Thu Nov 12 07:44:24 UTC 2020

$ docker run --rm temp ls -la /bin/now
-rwxrwxr-x    1 root     root             5 Nov 12 07:44 /bin/now

$ docker rmi temp
Untagged: temp:latest
Deleted: sha256:8f30b527dd29203b67c86290b34b0a29d3c98a48134609d0b1e2b89087a7d6e7
Deleted: sha256:cd1fafd96ef3084226c5f98f472e3e08bc9a9f0448cc3e68b6f1c192d12d778a
Deleted: sha256:e58c75acbf953a64d35089cf50e1c5b762601e1cb9d9d1d668e135f23ce1fe86
$docker build-t temp-在95919b575638中运行
拆卸中间容器95919b575638
--->cd1fafd96ef3
步骤3/3:CMD/bin/now
--->在03b5c3ac7265中运行
拆卸中间容器03b5c3ac7265
--->8f30b527dd29
成功构建8f30b527dd29
已成功标记temp:latest
$docker运行--rm临时
11月12日星期四07:44:24 UTC 2020
$docker run--rm temp ls-la/bin/now
-RWXR-x 1根目录11月12日07:44/bin/now
$docker rmi临时工
未标记:温度:最新
已删除:sha256:8f30b527dd29203b67c86290b34b0a29d3c98a48134609d0b1e2b89087a7d6e7
已删除:sha256:cd1fafd96ef3084226c5f98f472e3e08bc9a9f0448cc3e68b6f1c192d12d778a
删除:sha256:e58c75acbf953a64d35089cf50e1c5b762601e1cb9d9d1d668e135f23ce1fe86

AFAIK:没有。注意:不需要644,这取决于
umask
您希望实现的
chmod 777
是错误和危险的!您应该将代码调整为合适的权限(在大多数情况下,类似于755);如果您在面向公众的主机上有全局可写系统文件,请使用正常权限重新映像系统,然后开始调查你是否因犯罪疏忽而触犯了法律。不,不,我想我无法正确地放置查询…它不是关于特定的权限或特定的文件名…而子程序是我正在使用的代码片段…我只是想知道是否有一个命令可以同时执行这两个操作一起…对于目录,我们有mkdir-m777dirname…就像使用这个技巧一样,在更改之前,仍然会使用默认的umask权限创建文件注释。这可能会失败(断电、奇怪的ACL、文件系统问题等),并在系统上留下具有错误权限的文件。这是一个单行shell命令,但由shell分两步执行。是确保在创建文件时使用所需权限创建文件的正确方法。之后如何将
umask
更改回其以前的值?在更改umask之前启动一个新shell,然后您可以退出该shell以取回旧的umask。对于一个目录=>
install-m700-d/tmp/mydir
很好的技巧,谢谢
永远不要将任何东西设置为777
这意味着什么<代码>上传
nginx下所有我的网站上的文件夹perfect@Vasilii然后,您的web服务器就像一块奶酪布一样充满了漏洞。这是不安全的,如果你将任何东西(更不用说公共服务文件夹)设置为777,那么你就让所有的门都敞开着。听起来很恐怖,让它停止运行servers@VasiliiSuricov正确的解决方案包括以下几点:目录与web服务器属于同一用户,权限有限,正在标记为包含临时文件,请确保n
$ docker build -t temp - <<EOF
FROM alpine
RUN echo "date" | install -m 775 /dev/stdin /bin/now
CMD /bin/now
EOF

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM alpine
 ---> d6e46aa2470d
Step 2/3 : RUN echo "date" | install -m 775 /dev/stdin /bin/now
 ---> Running in 95919b575638
Removing intermediate container 95919b575638
 ---> cd1fafd96ef3
Step 3/3 : CMD /bin/now
 ---> Running in 03b5c3ac7265
Removing intermediate container 03b5c3ac7265
 ---> 8f30b527dd29
Successfully built 8f30b527dd29
Successfully tagged temp:latest

$ docker run --rm temp
Thu Nov 12 07:44:24 UTC 2020

$ docker run --rm temp ls -la /bin/now
-rwxrwxr-x    1 root     root             5 Nov 12 07:44 /bin/now

$ docker rmi temp
Untagged: temp:latest
Deleted: sha256:8f30b527dd29203b67c86290b34b0a29d3c98a48134609d0b1e2b89087a7d6e7
Deleted: sha256:cd1fafd96ef3084226c5f98f472e3e08bc9a9f0448cc3e68b6f1c192d12d778a
Deleted: sha256:e58c75acbf953a64d35089cf50e1c5b762601e1cb9d9d1d668e135f23ce1fe86