【问题标题】:Single command to create a file and set its permission创建文件并设置其权限的单个命令
【发布时间】:2014-02-16 00:28:20
【问题描述】:

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

touch filename.ext
chmod 777 filename.txt

我的问题是,unix (korn shell) 中是否有任何单个命令可以同时执行这两项操作,即创建一个具有所需权限的 0B 文件?

【问题讨论】:

  • 无论您希望实现什么 chmod 777 都是错误危险的!你应该调整你的适合权限的代码(在大多数情况下,类似于 755);如果您在面向公众的主机上拥有全球可写系统文件,请使用健全的权限重新映像系统,并开始调查您是否因犯罪过失而违反法律。

标签: shell unix file-permissions ksh


【解决方案1】:
install -m 777 /dev/null filename.txt

【讨论】:

  • 对于目录 => install -m 700 -d /tmp/mydir
  • 对于新的脚本文件,install /dev/null script.sh 效果很好,因为install 的默认权限是755
【解决方案2】:

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

chmod 777 filename.txt>>!#:2

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

chmod 644 filename>>filename

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

【讨论】:

  • 使用此技巧,在更改之前仍会使用默认的 umask 权限创建文件注释。这可能会失败(断电、奇怪的 ACL、文件系统问题等)并在系统上留下具有错误权限的文件。这是一个单行 shell 命令,但由 shell 分两步执行。 Setting the umask 是确保文件在创建时具有所需权限的正确方法。
【解决方案3】:

首先,您永远不应该对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)

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

【讨论】:

  • NEVER be setting anything to 777 是什么意思? upload我所有网站上nginx下的文件夹都觉得自己很完美
  • @Vasilii 那么你的网络服务器就像一块奶酪布一样充满了漏洞。这是不安全的,如果您将任何内容(更不用说公开提供的文件夹)设置为 777,那么您将敞开所有大门。
  • 听起来很吓人))**留下来停止服务器
  • @VasiliiSuricov 正确的解决方案涉及几件事:目录由与 Web 服务器相同的用户拥有,具有有限的权限,被标记为包含临时文件,确保上传的任何内容都无法获得模式 7(执行,+x)权限,并确保告诉 Web 服务器其中不应该运行任何内容(例如,php 文件只能作为原始内容下载,而不是 run作为代码。
【解决方案4】:

您可以创建自己的命令:

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

create filename.ext 644

【讨论】:

  • 不,不,我认为我无法正确放置查询...这与特定权限或特定文件名无关...。子程序是 sn-p我正在使用...我只是想知道是否有一个命令可以同时执行这两项操作...对于我们拥有 mkdir -m 777 dirname 的目录...同样
【解决方案5】:

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

install -m 755 <(echo commands go here) newscript

&lt;() 将输出放入临时文件 (Process-Substitution)

【讨论】:

  • 非常有助于使用查找和替换机制(例如 sed)安装输入文件。
【解决方案6】:

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

umask 0

那么当你 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

【讨论】:

  • 之后如何将umask 改回原来的值?
  • 在更改 umask 之前启动一个新的 shell,然后您可以退出该 shell 以取回旧的 umask。 unix.stackexchange.com/a/65890/79839
【解决方案7】:

touch filename.ext &amp;&amp; chmod 777 $_

$_ 是最近的参数

但正如其他人所说,777 不是一个好主意

【讨论】:

    【解决方案8】:

    由于 Docker 和 Alpine,我想有很多人对在没有 bash-ism 帮助的情况下创建可执行的单行代码感兴趣。 install 很简单

    $ 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
    

    【讨论】:

    • 我不明白这与问题有什么关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多