Как создать временный файл с «нормальными» разрешениями?

Как создать временный файл с «нормальными» разрешениями?

В скрипте сборки я хочу создать временный файл с уникальным сгенерированным именем, затем записать в него некоторые данные, а затем переименовать этот файл в его окончательное имя (причина этой процедуры в том, что я хочу, чтобы переименование происходило (в основном) атомарно).

Но если я использую mktemp, новый файл будет иметь очень ограниченные права доступа:

Файлы создаются u+rw, а каталоги u+rwx, без ограничений umask.

... и эти разрешения будут сохранены при переименовании файла. Однако я хочу, чтобы у полученного файла были "нормальные" разрешения; то есть, у него должны быть те же разрешения, что и у файлов, созданных с помощью touchили перенаправлением оболочки.

Какой рекомендуемый способ этого добиться? Есть ли (распространенная) альтернатива mktemp; или есть простой и надежный способ изменить права доступа к файлам на обычные umaskразрешения впоследствии?

решение1

Вы можете использовать chmod =rw "$file"после создания временного файла.Страница руководства GNUговорит:

Комбинация букв ugoaопределяет, доступ каких пользователей к файлу будет изменен: [...] Если ни один из них не указан, эффект будет таким же, как если бы был указан (a), но биты, установленные в umask, не будут затронуты.

Таким образом, =rwдает разрешения на чтение и запись, уменьшенные на umask, аналогично передаче 0666в качестве аргумента разрешений open(), что и сделали бы , например touch filename, или echo > filename.

ЭтоФункция POSIX, поэтому другие реализации также должны его поддерживать.

решение2

Используйте эту ссылку, чтобы получить желаемые разрешения.http://permissions-calculator.org/

Руководство

Создайте файл скрипта, который создает новый файл, а затем изменяет его разрешения.

#!/bin/bash

Filename=$1
Perms=$2

#Create a temp file
touch $Filename

#Change the file's permissions (Use your own desired permissions)
chmod $Perms $Filename

После того, как вы сделаете скрипт исполняемым chmod +x myscript.sh, выполните файл скрипта следующим образом:./myscript.sh tempfile 600

Использование Umask (не рекомендуется)

Вы можете временно изменить разрешения файлов по умолчанию, umask 600например, с помощью.

Чтобы навсегда изменить права доступа к файлам по умолчанию, отредактируйте файл .bashrc в корневом каталоге пользователя.

nano ~/.bashrc

добавьте umask 600в конец файла. Конечно, убедитесь, что вы соответствуете желаемым разрешениям. Убедитесь, что вы также редактируете правильного пользователя.

Если это для скрипта сборки, я бы использовал ручной метод вместо того, чтобы полагаться на umask. Особенно, если ваш скрипт сборки будет использоваться на разных системах.

Связанный контент