Při vytváření adresářů mkdir -m <mode> <dir>
umožňuje vytvoření jednoho nebo více adresářů s daným režimem/oprávnění nastaveným (atomicky).
Existuje ekvivalent pro vytváření souborů na příkazovém řádku?
Něco podobného:
open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);
Je použití touch
následované chmod
mojí jedinou možností?
Edit: Poté, co jsem vyzkoušel teppicův návrh použít install
, procházel jsem jej skrz strace
, abych viděl, jak blízko byl atomový. Odpověď zní:
$ 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
...
Přesto je to jediný příkaz Shell a ten, který jsem předtím nevěděl.
Mohli byste použít příkaz install
(část GNU coreutils) s fiktivním souborem, např.
install -b -m 755 /dev/null newfile
Možnost -b
Zálohuje newfile
, pokud již existuje. Pomocí tohoto příkazu můžete také nastavit vlastníka.
touch
vždy vytvoří soubor, pokud neexistuje, vždy následuje symbolické odkazy a vždy činí soubor neproveditelným. Čtení a zápis bitů se můžete rozhodnout pomocí mask .
(umask 077; touch file) # creates a 600 (rw-------) file
(umask 002; touch file) # creates a 664 (rw-rw-r--) file
„Bezpečné“ vytváření atomových souborů (zejména s O_NOFOLLOW
) není možné s tradičními nástroji Shell. V Perlu můžete použít sysopen
. Pokud máte utilitu mktemp
inspirovanou BSD, vytvoří soubor atomicky pomocí O_NOFOLLOW
; Pokud výchozí režim 600 není ten pravý, musíte zavolat chmod
.
Pokud chcete vytvořit soubor s obsahem a režimem současně (bash), na základě odpovědi @ teppic:
install -m 755 <(echo commands go here) newscript
<()
umístí výstup do dočasného souboru, viz Substituce proces