10
votes

Quand est Umask () utile?

umask() sets the calling process’s file mode creation mask (umask) to mask & 0777.

1 commentaires

4 Réponses :


1
votes

citant Cet article :

Le but de l'umask est d'autoriser les utilisateurs d'influencer les autorisations donné aux fichiers nouvellement créés et répertoires. Les démons ne doivent pas permettre eux-mêmes pour être affectés par cette définir, parce que ce qui était approprié pour l'utilisateur ne sera pas nécessairement Convient au démon.

Dans certains cas, il peut être plus pratique pour que l'umask soit réglé sur une valeur non nulle. Ceci est également acceptable: le point important est que le démon a pris le contrôle de la valeur, par opposition à simplement accepter ce qu'il a été donné.


7 commentaires

@Blagovest Buyukliev, je ne vois toujours pas le but de umask , n'est-ce pas déjà disponible dans le paramètre de Ouvrir ?


Le deuxième argument de Ouvrir Spécifie le mode d'ouverture du fichier, c'est-à-dire quelles opérations seront disponibles sur le descripteur renvoyé. umask , d'autre part, spécifie les autorisations de système de fichiers qui seront définies pour chaque fichier nouvellement créé.


@Blagovest Buyukliev, n'est-ce pas aussi disponible là-bas? int cree (Const Char * pathname, mode mode_t);


Créer est l'ancien moyen obsolète de créer un nouveau fichier vide. C'est la même chose que Ouvrir avec le drapeau o_creat .


@Blagovest Buyukliev, je veux dire, soit create ou Ouvrir a son paramètre pour Mode et drapeau , , umask me semble toujours inutile pour moi.


Oui, Ouvrir peut être utilisé avec un paramètre , mais umask définit le par défaut pour que vous n'ayez pas à le transmettre à chaque fois .


@Blagovest Buyukliev, selon la réponse de @aaron Digulla, Umask ne fournit pas de valeur par défaut, mais le mode final est une combinaison de mode et ~ umask .



6
votes

L'omasque est appliqué à tous les modes utilisés dans les opérations du système de fichiers. Du manuel ouvert (2) :

Les autorisations du fichier créé sont (mode & ~ umask)

Donc, avec un seul appel à Umask, vous pouvez influencer le mode de tous Créer des fichiers.

Ceci est généralement utilisé lorsqu'un programme souhaite que l'utilisateur autorise à alterner les subventions par défaut pour les fichiers / répertoires qu'il crée. Un utilisateur paranoïaque (ou une racine) peut définir l'umask sur 0077 ce qui signifie que même si vous spécifiez 0777 dans ouvert (2) , seulement le L'utilisateur actuel aura accès.


6 commentaires

Et si Umask est 777 , personne ne peut le modifier alors?


semble ouvert peut également être appelé sans le paramètre paramètre , int ouvert (const char * pathname, int Drapeaux); , quelle sera la permission de fichiers créés dans ce cas?


Oui. Cela n'a pas beaucoup de sens, mais rien ne vous empêche de créer des fichiers que vous ne pouvez pas vous accéder. En fait, j'utilise cela pour arrêter les programmes pour créer / modifier des fichiers et des dossiers indésirables avec chmod 0 .configdir


est ouvert sans mode: cela dépend de votre saveur de Unix. Sur My Linux, vous devez spécifier le mode lorsque vous utilisez O_Creat . Certaines Unixes construisent le mode à partir du mode du répertoire contenant le nouveau fichier. Pour plus de détails, lisez les documents.


Donc, le umask (0); ne fait que réinitialiser l'umask à sa valeur par défaut?


@ Fábiorobertoteodoro Ouais, vous pouvez le regarder de cette façon. Dans mon esprit, il désactive l'effet de umask () .



5
votes

Je sais que c'est et c'est une question ancienne, mais voici mes deux centimes:

autorisations d'objet de mémoire partagée

J'essayais de faire un objet de mémoire partagé, avec : xxx

La mémoire partagée résultante n'a pas eu l'autorisation de l'argument du mode, donc j'ai lu la page SHM_OPEN Man qui m'a conduit à la fonction ouverte page et là, il dit:

Mode spécifie les autorisations à utiliser au cas où un nouveau fichier est créé. Cet argument doit être fourni lorsque O_CREAT est spécifié dans les drapeaux; Si O_Creat n'est pas spécifié, le mode est ignoré. Les autorisations efficaces sont modifiées par l'umask du processus de la manière habituelle: les autorisations du fichier créé sont (mode et ~ umask). Notez que ce mode s'applique uniquement aux accès futurs du fichier nouvellement créé

J'ai donc essayé de modifier l'umask avec: xxx

mais il n'a pas fonctionné non plus, donc après plus de Google, j'ai trouvé ce Définition de la permission document dans gnu.org

qui recommande :

Lorsque votre programme doit créer un fichier et contourner l'umask pour ses autorisations d'accès, le moyen le plus simple de le faire est d'utiliser Fchmod après l'ouverture du fichier, plutôt que de changer l'umask. En fait, changer l'umask est généralement effectué uniquement par des coquilles. Ils utilisent la fonction Umask.

et avec fchmod ma fonction a fonctionné comme je voulais :) elle est: xxx


1 commentaires

Vous ne voudrez peut-être pas appeler FCHMOD uniquement sur la création de la mémoire partagée (essayez d'ouvrir avec RDWR, puis de vérifier errno pour Enoent, puis do O_RDWR | O_CREAT et FCHMOD), car vous ne pouvez pas FCHMOD de la mémoire partagée d'un autre utilisateur, même avec 777 autorisations. Sinon, si vous essayez d'ouvrir un objet de mémoire partagé créé par un autre utilisateur, vous obtiendrez une erreur d'autorisations.



0
votes

la plupart des développeurs MAC (et par extension de la plupart des testeurs de logiciels), à partir du moment où ils étaient bébés, mettez ceci dans leur fichier .CSHRC xxx pré>

Cependant, la plupart des utilisateurs finaux ne savent pas sur Umask , Donc, s'ils créent un nouvel utilisateur sur la machine et exécutez votre application, vous êtes susceptible de créer un tas de fichiers journaux et de ne pas les autorisations de lecture / écriture de groupe. Ensuite, ils changent à nouveau les utilisateurs et soudainement votre application ne fonctionne pas. Pour cette raison, nous en ajoutant ceci à toutes nos applications. Notre règle de base en matière de sécurité est que "nous voulons que les utilisateurs puissent utiliser notre logiciel". P>

#import <sys/types.h>
#import <sys/stat.h>
int main(int argc, char *argv[])
{
    // set permissions for newly created files to ug+rwX,o+rX
    umask(0002); 


0 commentaires