101 votes

permissions os.Mkdir et os.MkdirAll

J'essaie de créer un fichier journal au début de mon programme.

Je dois vérifier si un /log existe, s'il ne crée pas le répertoire, passez à la création du fichier journal.

J'ai essayé d'utiliser os.Mkdir (ainsi que os.MkdirAll ), mais quelle que soit la valeur que je mets dans le deuxième paramètre, j'obtiens un dossier verrouillé sans permissions. Quelle doit être la valeur de ce paramètre afin d'obtenir une lecture / écriture pour le dossier de l'utilisateur ? Je pensais que ce serait 0x700 mais ça ne semble pas fonctionner.

Merci !

165voto

Shannon Points 1579

Vous pouvez utiliser directement la notation octale :

os.Mkdir("dirname", 0700)

Bits de permission

+-----+---+--------------------------+
| rwx | 7 | Read, write and execute  |
| rw- | 6 | Read, write              |
| r-x | 5 | Read, and execute        |
| r-- | 4 | Read,                    |
| -wx | 3 | Write and execute        |
| -w- | 2 | Write                    |
| --x | 1 | Execute                  |
| --- | 0 | no permissions           |
+------------------------------------+

+------------+------+-------+
| Permission | Octal| Field |
+------------+------+-------+
| rwx------  | 0700 | User  |
| ---rwx---  | 0070 | Group |
| ------rwx  | 0007 | Other |
+------------+------+-------+

Une introduction aux permissions Unix

Usages courants de la permission

0755 Couramment utilisé sur les serveurs web. Le propriétaire peut lire, écrire, exécuter. Tous les autres peuvent lire et exécuter, mais pas modifier le fichier.

0777 Tout le monde peut lire, écrire et exécuter. Sur un serveur web, il n'est pas conseillé d'utiliser la permission '777' pour vos fichiers et dossiers, car cela permet à n'importe qui d'ajouter du code malveillant à votre serveur.

0644 Seul le propriétaire peut lire et écrire. Tous les autres ne savent que lire. Personne ne peut exécuter le fichier.

0655 Seul le propriétaire peut lire et écrire, mais pas exécuter le fichier. Toutes les autres personnes peuvent lire et exécuter le fichier, mais ne peuvent pas le modifier.

www.maketecheasier.com/file-permissions-what-does-chmod-777-means/

Permissions de répertoire sous Linux

Lorsque l'on applique des permissions à des répertoires sous Linux, les bits de permission ont une signification différente de celle des fichiers ordinaires. ( source )

Lire le bit L'utilisateur peut lire les noms de fichiers contenus dans le répertoire.
Bit d'écriture L'utilisateur peut {ajouter, renommer, supprimer} des noms de fichiers SI le bit execute est également activé.
Exécuter le bit L'utilisateur peut entrer dans le répertoire et accéder aux fichiers qu'il contient.

https://unix.stackexchange.com/a/21252

Calculateur de permissions

permissions calculator

A portée de main Calculateur de permissions .

26voto

kostix Points 11762

La déclaration de @Daniel dans sa réponse n'est pas vraiment correcte, et aussi il parle d'un nombre décimal et utilise ensuite un nombre octal, comme @SashaCrofter l'a correctement souligné dans son commentaire.

En réalité, peu importe ce que formulaire votre valeur de permission est dans tant qu'elle représente des permissions Unix raisonnables.

Étant donné que les bits de permission sur les systèmes de fichiers POSIX se présentent sous la forme de triples bits - trois bits pour l'accès au propriétaire, au groupe et aux autres, plus trois bits de modificateurs (tels que les sticky bits), - il est d'usage d'utiliser des nombres octaux pour représenter les permissions comme chaque chiffre dans un nombre octal représente une valeur de trois bits.

Ainsi, lorsque vous utilisez 0700 dans un code Go, le 0 initial est supprimé et n'est là que pour indiquer à l'analyseur syntaxique qu'il s'agit d'un nombre octal littéral, et les trois lettres suivantes représentent les permissions de propriétaire, de groupe et d'autres, dans cet ordre. Si vous voulez, par exemple, activer le bit de groupe collant et rendre l'objet du système de fichiers lisible et exécutable par un groupe, vous devez spécifier 02750 et ainsi de suite.

Notez que les permissions réelles que l'objet du système de fichiers acquiert sont modulées par l'autorisation active de l'utilisateur. umask du processus qui crée l'objet.

Pour mieux appréhender ces sujets, il est préférable de lire le chmod les pages de manuel et la littérature générale sur les systèmes d'exploitation de type Unix.

19voto

Jossef Harush Points 1656

Vous pouvez réinitialiser le umask à 0. J'appellerais ceci comme première chose dans mon fichier principal

syscall.Umask(0)

Exemple

_ = os.MkdirAll("/tmp/dirs/1", 0664)
syscall.Umask(0)
_ = os.MkdirAll("/tmp/dirs/2", 0664)

Résultat

/tmp/dirs$ stat -c '%A %a %n' *
drw-r--r-- 644 1
drw-rw-r-- 664 2

12voto

torek Points 25463

En plus des autres réponses, rappelez-vous que sur les systèmes d'exploitation de type Unix et Linux, tous les programmes s'exécutent avec un umask réglage. L'umask, qui dans de nombreux cas prend la valeur 022 ou parfois 002 par défaut, est l'ensemble des permissions que le système va supprimer automatiquement des demandes de création de fichiers et de répertoires.

Cela signifie que la plupart des programmes - il y a plusieurs exceptions à cette règle - devraient utiliser le mode 0666 pour la création de fichiers et de modes 0777 pour créer des répertoires. Le site configuration de l'utilisateur enregistrée dans le processus en cours d'exécution, indique laquelle de ces permissions il faut enlever . Si le paramètre de l'utilisateur est 022 et nous créons un fichier avec le mode 0666 le réglage réel que nous obtenons est rw-r--r-- : lecture et écriture pour l'utilisateur, lecture seule pour le groupe, et lecture seule pour les autres.

Si un utilisateur souhaite étendre la possibilité d'écriture à son groupe, il lui suffit de définir son umask à 2 maintenant ils enlèvent le droit d'écriture pour les autres, mais le laissent pour leur groupe. Les nouveaux fichiers sont maintenant créés avec le mode rw-rw-r-- . Le site programme ne change pas : il utilise toujours 0666 pour son mode. Mais le fichiers sont créés avec le mode 0664 .

De même, si vous appelez os.Mkdir o os.MkdirAll avec 0777 le umask enlèvera les permissions non désirées, vous laissant avec les bonnes permissions.

Mais j'ai mentionné qu'il y avait des exceptions. Celles-ci incluent les programmes qui font des copies d'informations sensibles destinées uniquement à l'utilisateur : ceux-ci devraient généralement utiliser le mode 0700 pour les répertoires et 0600 pour les fichiers. Ils mai incluent des serveurs de longue durée qui agissent en tant qu'utilisateur du système plutôt qu'en tant qu'individu ... bien que ces serveurs podría être exécuté avec un umask correct, dans ce cas, 0777 o 0666 est bien.

Vous devez faire preuve de discernement ici. Les programmes qui sont particulièrement soucieux de la sécurité, comme ssh ou similaire, peuvent souhaiter utiliser des autorisations limitées, et peuvent même vouloir vérifier (avec os.Lstat ou similaire) que les permissions sont correctement serrées sur les répertoires importants.

(Notez que l'umask ne s'applique pas a os.Chmod appels. Ici vous choisir directement le mode).

4voto

Gwyneth Llewelyn Points 223

Une façon de s'assurer que vous définissez le type d'autorisations que vous souhaitez, sans avoir à effectuer des calculs complexes en octal, est d'utiliser l'outil très pratique FileMode constantes dans le paquet os :

https://golang.org/pkg/os/#FileMode

J'utilise habituellement os.ModePerm (qui est en fait codé comme 0777 ) pour les répertoires entièrement permissifs, tels que ceux requis pour les caches ou les fichiers temporaires, mais votre kilométrage peut varier. Pour définir les bits supplémentaires (sticky, etc.), qui, comme @kostix l'a noté, doit gérer le problème de la représentation octale des drapeaux en Go, vous pouvez toujours utiliser quelque chose comme :

if err := os.MkdirAll("my/tmp/dir", os.ModeSticky|os.ModePerm); err != nil {
  ... handle error ...
}

Aller au terrain de jeu

Comme toujours, il convient de mentionner à nouveau que ces autorisations sont "filtrées" par n'importe quelle méthode umask a été défini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X