Les fichiers peuvent-ils être créés avec des autorisations définies sur la ligne de commande?


37

Lors de la création de répertoires, mkdir -m <mode> <dir>permet de créer un ou plusieurs répertoires avec le mode / autorisations défini (de manière atomique).

Existe-t-il un équivalent pour la création de fichiers sur la ligne de commande?

Quelque chose qui ressemble à:

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

Est-ce que l'utilisation touchsuivie de chmodma seule option est ici?


Edit: Après avoir essayé la suggestion de teppic à utiliser install, je l’ai parcourue stracepour voir à quel point elle était atomique. La réponse est, pas très:

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

Pourtant, il s’agit d’une seule commande shell, une commande que je ne connaissais pas auparavant.

Réponses:


47

Vous pouvez utiliser la installcommande (partie de GNU coreutils) avec un fichier factice, par exemple

install -b -m 755 /dev/null newfile

L' -boption est sauvegardée newfilesi elle existe déjà. Vous pouvez également utiliser cette commande pour définir le propriétaire.


4
+1 pour me présenter àinstall
Quornian

C'est une petite commande utile. Comme son nom l'indique, il est vraiment conçu pour installer un logiciel compilé à partir du code source, afin d'éviter de devoir utiliser chmod, chown, etc., tout le temps.
Teppic

Si seulement il fallait stdin! OK, / proc / self / fd / 0 fera l'affaire.
proski

Notez que le mode 755 correspond aux autorisations par défaut des fichiers créés avec install, il -m 755n'est donc pas nécessaire.
Kusalananda

@Kusalananda C'est évidemment juste un exemple montrant comment définir un mode, puisque telle était la question, pas comment définir le 755.
Teppic

22

touchcrée toujours le fichier s'il n'existe pas, suit toujours les liens symboliques et rend toujours le fichier non exécutable. Vous pouvez décider des bits de lecture et d'écriture via umask .

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

La création de fichiers atomiques «sécurisés» (en particulier avec O_NOFOLLOW) n'est pas possible avec les outils de shell traditionnels. Vous pouvez utiliser sysopenperl. Si vous avez l' mktemputilitaire inspiré de BSD , il crée un fichier de manière atomique avec O_NOFOLLOW; vous devrez appeler chmodaprès si le mode par défaut de 600 n'est pas le bon.


J'étais en train de rédiger une explication plus détaillée, mais les articles de Wikipédia couvrent parfaitement tout.
Jordanie

Si seulement touchj'avais la possibilité de créer des fichiers exécutables, c'est vraiment ce que je recherche. Ensuite, umaskpourrait être utilisé pour adapter les détails. Malheureusement , il n'y a aucun moyen avec umasket touchde créer des exécutables.
Quornian

@quornian Vous ne pouvez de toute façon pas créer un fichier non-vide de manière atomique. Quel est l'intérêt de créer un fichier exécutable vide de manière atomique? Utilisez touchsuivi de chmod +x.
Gilles 'SO- arrête d'être méchant'

4
Vous pouvez créer des fichiers exécutables non vides de manière atomique avec ... ln ou mv. Vous pouvez toujours créer le fichier avec le contenu et les autorisations appropriés dans un répertoire créé avec umask 077 et le déplacer ou le déplacer ensuite.
Stéphane Chazelas le

-1

J'ai un script bash dans mon répertoire personnel /home/anthony/touchmod.shcontenant:

#!/bin/bash

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

Donc, si je dois créer readme.txtavec 644 autorisations, je peux taper:

~/touchmod.sh 644 readme.txt

3
Vous n'avez probablement pas compris la question. C'est exactement ce que le questionneur essaie d'éviter.
Ceving
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.