Можно ли создавать файлы с разрешениями, установленными в командной строке?


37

При создании каталогов mkdir -m <mode> <dir>предусматривает создание одной или нескольких папок с заданным режимом / разрешениями (атомарно).

Есть ли эквивалент для создания файлов в командной строке?

Что-то похожее на:

open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);

Использование с touchпоследующим chmodмоим единственным вариантом здесь?


Изменить: После того, как опробовал предложение Teppic использовать install, я пробежал его, straceчтобы увидеть, насколько это было близко к атомному. Ответ не очень:

$ strace install -m 777 /dev/null newfile
...
open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=0, ...}) = 0
...
fchmod(4, 0600)                         = 0
close(4)                                = 0
...
chmod("newfile", 0777)                  = 0
...

Тем не менее, это единственная команда оболочки, которую я не знал раньше.

Ответы:


47

Вы могли бы использовать install команду (часть GNU coreutils) с пустым файлом, например

install -b -m 755 /dev/null newfile

-bВариант поддерживает , newfileесли он уже существует. Вы также можете использовать эту команду, чтобы установить владельца.


4
+1 за то, что познакомил меня сinstall
— quornian

Это полезная маленькая команда. Как следует из названия, он действительно предназначен для установки программного обеспечения, скомпилированного из исходного кода, чтобы избавить от необходимости постоянно использовать chmod, chown и так далее.
— teppic

Если бы только это заняло! ОК, / proc / self / fd / 0 подойдет для моей цели.
— Проски

Обратите внимание, что режим 755 является разрешениями по умолчанию для файлов, созданных с помощью install, поэтому -m 755не требуется.
— Кусалананда

@Kusalananda Это, очевидно, просто пример того, как установить режим, так как это был вопрос, а не как установить 755.
— teppic

22

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

(umask 077; touch file)  # creates a 600 (rw-------) file
(umask 002; touch file)  # creates a 664 (rw-rw-r--) file

«Безопасное» создание атомарного файла (в частности, с помощью O_NOFOLLOW) невозможно с помощью традиционных инструментов оболочки. Вы можете использовать sysopenв Perl. Если у вас есть mktempутилита, вдохновленная BSD , она создает файл атомарно с O_NOFOLLOW; Вам придется позвонить chmodпозже, если режим по умолчанию 600 не является правильным.


Я был в процессе написания более подробного объяснения, но статьи в Википедии освещают все просто отлично.
— Иордания

Если touchбы у меня была возможность создавать исполняемые файлы, это действительно то, что мне нужно. Затем umaskможет быть использован для настройки деталей. К сожалению, нет никакого способа umaskи touchдля создания исполняемых файлов.
— Quornian

@quornian В любом случае вы не можете создать непустой файл атомарно. Какой смысл создавать пустой исполняемый файл атомарно? Используйте с touchпоследующим chmod +x.
— Жиль "ТАК - перестань быть злым"

4
Вы можете создавать непустые исполняемые файлы атомарно с помощью ... ln или mv. Вы всегда можете создать файл с нужным содержимым и разрешениями в каталоге, созданном с помощью umask 077, и затем переместить его или в него.
— Стефан Шазелас

-1

В моем домашнем каталоге есть скрипт bash, /home/anthony/touchmod.shсодержащий:

#!/bin/bash

touch "$2"
chmod "$1" "$2"

Поэтому, если мне нужно создать readme.txtс 644 разрешениями, я могу набрать:

~/touchmod.sh 644 readme.txt

3
Вы, вероятно, не поняли вопрос. Это именно то, что спрашивающий пытается избежать.
— выступление
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.