无法为此处文档创建临时文件:权限被拒绝


11

[注意:这个类似的Q与相同的bash错误消息有关。它被标记为其他Q的副本。但是由于我发现了这个错误的不同来源,因此我将在下面回答我自己的问题。]

以前工作的bash脚本行

while ... do ... done <<< "$foo"

一天开始产生此错误消息:

无法为此处文档创建临时文件:权限被拒绝


在我的情况下,它启用了IMAima_policy=appraise_tcb内核参数),但组合为/tmpnot tmpfs。但这不是一个普通的情况:)。
pevik

Answers:


10

我已经umask 777在here字符串之前添加了。删除umask后,错误消失了。因此,我们汲取了教训:为此处的字符串(<<<)创建了一个临时文件,该文件与此处的文档(<<)有关,并且必须设置适当的umask才能使它们起作用。



它还会影响zsh和mksh,而不影响ksh93或tcsh。也不是破折号,rc,es或yash,但这是因为它们使用管道而不是临时文件。
斯特凡Chazelas

对于ksh93和tcsh,它们之所以起作用,是因为它们在读+写模式下仅打开文件一次,然后写入数据,然后返回到开头。
斯特凡Chazelas

6

就我而言,我更改了/tmp目录默认权限(我认为我误将其更改为0777)。

解决方案是将其还原为默认/tmp权限,即八进制的1777(1 =粘性位,7 = R + W + X)。

因此,简而言之sudo chmod -R 1777 /tmp应该解决该问题。


我可以看到确实会导致问题的地方。是的,粘性位对于/ tmp很重要。
椭圆视图

2
您可能不想要该-R标志。没有理由将下面每个人的文件都更改为所有人都/tmp可以读写执行。其中一些文件对用户的安全敏感。
keithpjolley

1

我对这个问题的个人经验是umask二进制表示法,就像@ eliptical-view一样。我以为是这样写的:

umask 0644 

会给我对我创建的文件的读写权限,这是怎么回事

在我更改umask

umask 0022

错误消失了。

实际上,二进制符号应理解为二进制补码。

因此,在umask下面的掩码中,当某人0为文件所有者写信时,该用户将完全有权访问他或她创建的文件。该值2表示第二位被屏蔽,这意味着在这种情况下,默认情况下,将不允许其他用户写入文件所有者创建的文件。


1
感谢您的编辑和更正,@ PauloTomé。确实,在中使用八进制表示法是很常见的(很明显)umask,因为Posix文件权限中恰好涉及到三位-对于所有者,他或她的一个组以及其他所有人。
费尔南德斯希尔顿

别客气。;)
PauloTomé
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.