Чи можна створювати файли з дозволами, встановленими в командному рядку?


37

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

Чи є еквівалент для створення файлів у командному рядку?

Щось схоже на:

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

Користуємося touchслід chmodмоєму єдиним варіантом тут?


Редагувати: Після того, як спробував запропонувати теппік використовувати 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
курінь

Це корисна маленька команда. Як випливає з назви, він дійсно розроблений для встановлення програмного забезпечення, зібраного з вихідного коду, щоб зберегти необхідність весь час користуватися chmod, chown тощо.
теппік

Якби тільки було потрібно stdin! Гаразд, / proc / self / fd / 0 зробить з моїми цілями.
proski

Зауважте, що режим 755 є типовими правами файлів, створених за допомогою install, тому -m 755він не потрібен.
Kusalananda

@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 Не можна атомним чином створити не порожній файл. Який сенс створювати порожній виконуваний файл атомним шляхом? Використання touchпотім chmod +x.
Жил "ТАК - перестань бути злим"

4
Ви можете створювати непорожні, виконувані файли атомно за допомогою ... ln або mv. Ви завжди можете створити файл із потрібним вмістом та дозволами у каталозі, створеному за допомогою umask 077, і перемістити його чи продовжити його згодом.
Стефан Шазелас

-1

У моєму домашньому каталозі є скрипт bash, /home/anthony/touchmod.shщо містить:

#!/bin/bash

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

Тож якщо мені потрібно створити readme.txt644 дозволи, я можу набрати:

~/touchmod.sh 644 readme.txt

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