重定向输出时如何设置特定文件权限?


8

这可能是重复的,但我的所有搜索都提出了有关权限被拒绝错误的问题。

我在bash shell中运行命令。我想重定向输出以追加到第一次运行时可能不存在的文件。如果输出重定向必须创建此文件,我想设置特定的文件权限模式。有没有办法用一个命令来做到这一点?

例如,我可能会尝试

foo >> /tmp/foo.log 0644

哪里 0644 是我想要的权限 foo.log 结束。我在bash中尝试过的大多数命令最终都会解释 0644 作为一个额外的论据 foo

我觉得这将是第二个命令 chmod 写入之前或之后的权限。

我正在使用GNU bash 4.2.25和Ubuntu 12.04,如果这有所不同 - 一般答案是首选。

Answers:


5

据我所知,在管道时没有办法做到这一点,简单的脚本可能是最好的解决方案。

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi

谢谢Slowki,这也是我的预感。我打算把它打开几天,以期吸引一位大师来启发我们。
Patrick M

3
这种方法的问题是,当文件的权限错误时,它会创建一个短时间窗口。如果目标是保护敏感数据,我不会使用它。
proski

11

我知道这是一个老问题,但我想加两分钱。

我有同样的想法,想出了类似的解决方案 BowlesCR 。 他的解决方案的问题是我的命令( foo )如果我在运行之前更改了umask,它将无法工作,所以这是我对问题的看法:

foo | ( umask 0033; cat >> /tmp/foo.log; )

这里, umask 只会影响重定向 foo.log 在子shell中。其他一切都不受影响。

有点复杂,但它的工作原理。


非常好用和有效:)只是不能在stdout redir上使用stderr重定向。
Orsiris de Jong

2

没有真正的脚本,你可以链接一下:

touch foo.log; chmod 0644 foo.log; foo >> foo.log

有效地类似于Slowki的答案,但凝聚成一个单行。

我唯一能想到的就是修补umask。最好在子shell中执行此操作,以便它不会污染当前环境:

(umask 0033 && foo >> foo.log)

但是有两个问题。

  1. Umask无法将权限提升到超出指定级别的权限 creat() 系统调用(0644似乎是Bash使用的)。
  2. 这不会更改现有文件的权限(因为您正在使用 >> 附加运营商)。

我仍然足够新,以至于umask对我来说仍然有点神奇。感谢您的提示,我一定会读到它。
Patrick M

嗯......仍然允许无特权的进程打开文件然后读取其内容。
Feuermurmel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.