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

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
...

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

quornian
источник

Ответы:

47

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

install -b -m 755 /dev/null newfile

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

teppic
источник
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
TeamugDotNet
источник
3
Вы, вероятно, не поняли вопрос. Это именно то, что спрашивающий пытается избежать.
выступление