È possibile creare file con le autorizzazioni impostate sulla riga di comando?


37

Durante la creazione di directory, mkdir -m <mode> <dir>consente di creare una o più directory con la modalità / i permessi impostati (in modo atomico).

Esiste un equivalente per la creazione di file sulla riga di comando?

Qualcosa di simile a:

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

L'utilizzo è touchseguito da una chmodmia unica opzione qui?


Modifica: dopo aver provato il suggerimento di teppic da usare install, l'ho passato straceper vedere quanto fosse vicino all'atomico. La risposta è non molto:

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

Tuttavia, è un singolo comando shell e uno che non conoscevo prima.

Risposte:


47

È possibile utilizzare il installcomando (parte dei coreutils GNU) con un file fittizio, ad es

install -b -m 755 /dev/null newfile

L' -bopzione esegue il backup newfilese esiste già. Puoi usare questo comando anche per impostare il proprietario.


4
+1 per avermi fatto conoscereinstall
Quornian il

È un piccolo comando utile. Come suggerisce il nome, è davvero progettato per l'installazione di software compilato dal codice sorgente, per evitare di dover usare chmod, chown e così via continuamente.
teppico

Se solo ci fosse voluto stdin! OK, / proc / self / fd / 0 farà per il mio scopo.
proski

Si noti che la modalità 755 è le autorizzazioni predefinite dei file creati con install, quindi -m 755non è necessaria.
Kusalananda

@Kusalananda Ovviamente è solo un esempio di come impostare una modalità, poiché quella era la domanda, non come impostare 755.
teppic

22

touchcrea sempre il file se non esiste, segue sempre collegamenti simbolici e rende sempre il file non eseguibile. Puoi decidere i bit di lettura e scrittura attraverso l' umask .

(umask 077; touch file)  # creates a 600 (rw-------) file
(umask 002; touch file)  # creates a 664 (rw-rw-r--) file

Creazione sicura di file atomici (in particolare con O_NOFOLLOW ) non è possibile con gli strumenti shell tradizionali. Puoi usare sysopenin perl. Se hai l' mktemputilità ispirata a BSD , crea un file atomicamente con O_NOFOLLOW; dovrai chiamare in chmodseguito se la modalità predefinita di 600 non è quella giusta.


Stavo scrivendo una spiegazione più dettagliata, ma gli articoli di Wikipedia coprono tutto bene.
Giordania,

Se solo touchavessi la possibilità di creare file eseguibili, è proprio quello che sto cercando. Quindi umaskpotrebbe essere utilizzato per personalizzare i dettagli. Purtroppo non è possibile creare umaske touchcreare file eseguibili.
Quornian,

@quornian Non puoi comunque creare atomicamente un file non vuoto. Qual è il punto di creare atomicamente un file eseguibile vuoto? Usa touchseguito da chmod +x.
Gilles 'SO- smetti di essere malvagio' il

4
Puoi creare file eseguibili non vuoti atomicamente con ... ln o mv. Puoi sempre creare il file con il giusto contenuto e le autorizzazioni in una directory creata con umask 077 e spostarlo o inserirlo successivamente.
Stéphane Chazelas,

-1

Ho uno script bash nella mia directory home /home/anthony/touchmod.shcontenente:

#!/bin/bash

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

Quindi, se devo creare readme.txtcon autorizzazioni 644, posso digitare:

~/touchmod.sh 644 readme.txt

3
Probabilmente non hai capito la domanda. Questo è esattamente ciò che l'interrogante cerca di evitare.
ceving
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.