
В скрипте сборки я хочу создать временный файл с уникальным сгенерированным именем, затем записать в него некоторые данные, а затем переименовать этот файл в его окончательное имя (причина этой процедуры в том, что я хочу, чтобы переименование происходило (в основном) атомарно).
Но если я использую 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. Особенно, если ваш скрипт сборки будет использоваться на разных системах.