web-dev-qa-db-fra.com

Commande unique pour créer un fichier et définir son autorisation

J'utilise les 2 commandes suivantes pour créer un fichier 0B et définir son extension sur 644

touch filename.ext
chmod 777 filename.txt

Ma question est de savoir s'il existe une seule commande dans unix (korn Shell) qui fera les deux choses ensemble, c'est-à-dire créer un fichier 0B avec l'autorisation souhaitée?

27
user3075776
install -m 777 /dev/null filename.txt
32
proski

Pour bash, utilisez simplement chmod avec la redirection de fichiers et l'expansion de l'historique:

chmod 777 filename.txt>>!#:2

Pour ksh et zsh, vous devez supprimer l'expansion de l'historique (comme indiqué ci-dessus, il peut y avoir d'autres façons) et utiliser:

chmod 644 filename>>filename

Pour les scripts de n'importe quel Shell, vous n'avez pas (et n'avez vraiment pas besoin) d'extension d'historique, utilisez donc ce qui précède également.

13
Paul Evans

Tout d'abord, vous ne devez JAMAIS définir quoi que ce soit sur 777 autorisations. Il s'agit d'un énorme problème de sécurité et il n'est tout simplement pas nécessaire. Aux fins de cette question, je suppose que vous souhaitez créer un fichier avec des autorisations plus sécurisées que les valeurs par défaut, dites 600.

Il n'y a pas de solution unique pour créer ET modifier en toute sécurité les autorisations d'un fichier à l'aide de la plupart des outils bash. Même l'astuce de redirection délicate dans réponse de Paul crée en fait momentanément un fichier avec les autorisations par défaut avant de les réinitialiser. Tous les nouveaux fichiers sont également créés avec la valeur umask système définie, sauf si le programme de création envoie des demandes très spécifiques au système d'exploitation au moment de la création du nœud. Un masque de 133 est courant, ce qui signifie que vos fichiers sont créés avec 644 autorisations hors de la boîte.

Outre l'utilisation de la commande chmod pour définir les autorisations de fichier après avoir créé un fichier, vous pouvez également indiquer au système les valeurs par défaut que vous souhaitez à l'aide de la commande umask.

$ umask 077
$ touch test_file
$ ls -l test_file
-rw------- 1 user group 0 Jan 24 22:43 test_file

Vous remarquerez que le fichier a été créé avec 600 autorisations.

Cela restera en vigueur pour toutes les commandes exécutées dans un shell jusqu'à ce que vous fermiez ce shell ou définissiez manuellement une autre valeur. Si vous souhaitez utiliser cette construction pour exécuter une seule commande (ou même un petit ensemble d'entre eux), il peut être utile d'isoler les commandes dans un sous-shell

$ (umask 077 ; touch test_file)

Notez que tout ce que vous mettez dans les parens utilisera cet umask mais dès que vous le fermez, vous êtes de retour dans votre environnement précédent.

10
Caleb

Vous pouvez créer votre propre commande:

create () {
    touch "$1"
    chmod "$2" "$1"
}

create filename.ext 644
6
Roberto Bonvallet

La seule raison pour laquelle vos fichiers ne sont pas créés avec des autorisations 666 dès le départ est le umask. Donc, si vous désactivez le umask:

umask 0

puis lorsque vous touchez le fichier, il se retrouve automatiquement avec les autorisations 666. Ce ne serait pas une bonne idée de rendre les fichiers texte exécutables en général. Les répertoires se retrouveraient avec l'autorisation 777 avec umask désactivé.

chicks@freecandy /tmp $ umask
0022
chicks@freecandy /tmp $ touch x
chicks@freecandy /tmp $ mkdir xx

chicks@freecandy /tmp $ umask 0
chicks@freecandy /tmp $ touch y
chicks@freecandy /tmp $ mkdir yy

chicks@freecandy /tmp $ ls -ld x xx y yy                                                                                  
-rw-r--r-- 1 chicks chicks  484 Jan 24 14:37 x
drwxr-xr-x 2 chicks chicks 4096 Jan 24 14:37 xx
-rw-rw-rw- 1 chicks chicks    0 Jan 24 14:37 y
drwxrwxrwx 2 chicks chicks 4096 Jan 24 14:37 yy
2
chicks