Невозможно создать временный файл для здесь-документа: В доступе отказано

11

[Примечание: этот похожий Q касается того же сообщения об ошибке bash. Это было отмечено дубликат этого другого Q . Но поскольку я нашел совершенно другой источник этой ошибки, я отвечу на свой вопрос ниже.]

Эта ранее работающая строка сценария bash

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

однажды начал производить это сообщение об ошибке:

не может создать временный файл для здесь-документа: В доступе отказано

Эллиптический вид
источник
В моем случае был включен IMA ( ima_policy=appraise_tcbпараметр ядра) с комбинацией /tmpне быть tmpfs. Но это не совсем обычный случай :).
Pevik

Ответы:

10

Я добавил umask 777перед строкой здесь. После удаления umask ошибка ушла. Итак, извлеченный урок: существует временный файл, созданный для строки here ( <<<), и это связано с документом here ( <<), и вы должны иметь соответствующий набор umask, чтобы они работали.

Эллиптический вид
источник
Действительно интересно. +1 См. Unix.stackexchange.com/questions/166292/…
Руи Ф. Рибейро,
Это также влияет на zsh и mksh, а не на ksh93 и tcsh. Не dash, rc, es и yash, а потому, что они используют каналы вместо временных файлов.
Стефан Шазелас
В случае ksh93 и tcsh это работает, потому что они открывают файл только один раз в режиме чтения + записи, записывают данные и затем возвращаются к началу.
Стефан Шазелас
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означает, что 2-й бит замаскирован, что означает, что в этом случае другим пользователям по умолчанию не разрешается записывать в файлы, которые создает владелец файла.

Хилтон Фернандес
источник
1
Спасибо за редактирование и исправление, @Paulo Tomé. Действительно, обычно (и понятно) использовать восьмеричную нотацию umask, поскольку в разрешениях файла Posix участвуют ровно три бита - для владельца, одной из его или ее групп и всех остальных.
Хилтон Фернандес
Пожалуйста. ;)
Пауло Томе