it-swarm-eu.dev

Lze soubory vytvářet s oprávněními nastavenými na příkazovém řádku?

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.

38
quornian

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.

48
teppic

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

0
laktak