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


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.