Comment changer les permissions Unix quand je n'ai pas le fichier mais que vous avez la permission d'écriture sur le répertoire?
Je partage un dépôt git avec un collègue, et parce que git ne propage pas la panoplie complète de fichiers Unix autorisations, nous avons un "crochet" qui s'exécute sur la mise à jour qui définit les "autres", les autorisations dont ils ont besoin pour être ensemble. Le problème? Le crochet utilise chmod
, et il s'avère que lorsque mon collègue commet un fichier, il en est le propriétaire, donc je ne peux pas courir chmod
sur elle, et vice versa. Les répertoires de groupe en écriture, collant, donc je crois que l'un de nous a le droit de supprimer tout fichier et de le remplacer avec un autre du même nom, le même contenu, mais différente de la propriété. Sans doute, puis nous avons pu chmod
il. Mais cela semble être un très gros marteau, et je suis un peu réticent à l'idée de vissage jusqu'à. Donc, deux questions:
-
Quelqu'un peut-il penser à un autre moyen de le faire?
-
Si non, quelle est la meilleure conception pour un pare-balles script shell qui implémente "rendre ce fichier appartient à moi"? Pas de cross-système de fichiers se déplace, etc etc...
Pour ceux qui n'ont pas réalisé, l'autorisation d'écriture ne confère pas le droit de chmod
:
% ls -l value.c
-rw-rw---- 1 agallant ta105 133 Feb 10 13:37 value.c
% [ -w value.c ] && echo writeable
writeable
% chmod o+r value.c
chmod: changing permissions of `value.c': Operation not permitted
Nous sommes à la fois dans le ta105
groupe.
Notes:
-
Nous utilisons
git
non seulement de coordonner les changements, mais de publier le repo comme un site web du cours. La publication du site web est le but principal de l'opération. Les autorisations de script s'exécute à chaque mise à jour à l'aide d'un git crochet, et il s'assure que les étudiants n'ont pas l'autorisation de lire les solutions qui n'ont pas encore été dévoilée. -
S'il vous plaît ne suggèrent pas que j'ai du mal umask. Pas tous les fichiers dans le repo doit avoir les mêmes autorisations, et quelle que soit umask est choisi, les autorisations sur certains fichiers doivent être modifiés. Pour ne pas mentionner qu'il serait discourtois pour moi d'imposer mon umask préférences sur mes collègues.
-
Mise à JOUR: je viens d'apprendre que dans notre environnement, la racine est annulée à
nobody
sur toutes les machines, nous avons accès, de sorte qu'une solution qui s'appuie sur les privilèges de root ne fonctionne pas.
- Désolé, les mods n'ont pas la capacité de changer la réponse est acceptée et la réponse devient le bounty.
- Je suis probablement manquant une partie de votre scénario, mais il semble que vous devriez être à la recherche sur les autorisations de répertoire. La capacité de modifier les autorisations d'un fichier est déduit à partir du mode de réglage sur le répertoire dans lequel le fichier est en. Vous n'avez pas afficher les paramètres de ce répertoire. Sont-ils
drwxrwxr_x
ou quelque chose comme ça? Vous voulez probablementdrwxrwsr_x
. Votre les permissions du répertoire courant aiderait à clarifier. - selon
man 2 chmod
, vous devez être le propriétaire ou le super-utilisateur pour modifier les autorisations d'un fichier. Le répertoire parent, les permissions ne sont pas mentionnés, et semblent comme ils devraient être sans incidence sur les autorisations sont stockées dans l'inode, pas dans le répertoire (sinon deux liens en dur vers le même fichier peut avoir différentes autorisations).
Vous devez vous connecter pour publier un commentaire.
Il y a au moins un Unix dans lequel j'ai vu une façon de donner à quelqu'un
chmod
etchown
les autorisations sur tous les fichiers appartenant à un groupe particulier. Cela est parfois appelé "groupe de super-utilisateur" ou quelque chose de similaire.Le seul Unix, je suis positif que j'ai vu c'était sur la version d'Unix que le Encore Multimax couru.
J'ai cherché un peu, et alors que je me souviens de quelques vagues références à une capacité de ce genre dans Linux, j'ai été incapable de les trouver. Si cela peut ne pas être une option. Heureusement, il peut être simulé, mais la simulation est un peu dangereux.
La façon de simuler cela est très spécifique programme suid qui fera le
chmod
comme racine après avoir vérifié que vous êtes un membre du même groupe que le propriétaire du fichier, et votre nom d'utilisateur est répertorié comme ayant cette autorisation dans un spécial/etc/chmod_group
fichier qui doit être détenue par des racine et lisibles et modifiables que par racine.setcap(8)
utilitaire de subvention par exempleCAP_DAC_OVERRIDE
et ne pas permettreCAP_NET_BIND
ouCAP_SYS_ADMIN
, etc.La façon la plus simple pour ce faire est de rendre votre partenaire et vous les membres d'un nouveau groupe (disons "devel"), et le groupe du fichier. De cette façon, il peut être détenue par l'un de vous, et tant que le groupe est bon, vous pouvez à la fois de travailler avec elle.
Si cela ne fonctionne pas avec vous, "sudo" peut être configuré de manière à ce que seuls les deux utilisateurs peuvent exécuter une commande chmod sur les fichiers dans ce répertoire en tant que root sans mot de passe.
sudo
, mais il vaut la peine de regarder dans.Si vous définissez votre
umask
correctement, les fichiers peuvent être créés avec les autorisations correctes en premier lieu:Je vais prendre un peu de recul. Permettez-moi de savoir si je suis une violation de certains de restriction dans votre système je n'ai pas lu.
De votre question, je suppose que vous essayez de partager un dépôt git à l'aide de
file://
Url et en s'appuyant sur le système de fichiers UNIX autorisations de prendre soin de l'autorisation etc. Pourquoi ne pas envisager une autre façon de partager vos dépôts qui n'implique pas de cette dispute?Je pense à deux manières.
git daemon
de commande. Detais sont ici. Ce ne sera cependant pas vous donner de contrôle d'accès.Il y avait une question connexe, qui est venu il y a un moment qui pourrait être pertinente.
git daemon
a travaillé pour lui - L'administration d'un repo git sans rootJ'ai aussi trouvé quelque chose sur le serveur de pannes qui pourraient être pertinents pour votre problème de https://serverfault.com/questions/21126/git-daemon-and-access-control-for-multiple-repos
answered
branche qui contient seulement ce que les élèves devraient être autorisés à voir? De cette façon, vous n'avez pas à vous soucier des autorisations car, même s'ils clone de l'ensemble du public repo, ils ne seront pas la question qu'ils ne sont pas censé le faire.Sans doute pas la façon la plus élégante, mais elle semble fonctionner
l'on pourrait faire valoir qu'il pourrait être faite à l'épreuve des balles, mais quelqu'un apporte un RPG...
Si les deux de vous avez besoin de faire un chmod, je ne peux pas penser à une autre façon - si c'est OK que VOUS peut
chmod
mais pas de l'autre gars, vous pouvezchmod 6770 .
ouchmod g+s,u+s .
dans le répertoire (par exemple un ensemble SUID et GUID bits) de sorte que le propriétaire du répertoire sera toujours le propriétaire des fichiers. Malheureusement, certains (si pas plus), à savoir EXT2/3/4 ignorer le bit SUID.Bien sûr, la définition de la umask à 0002 permettra de résoudre le problème en ne la rendant pas obligatoire.
En supposant que votre publication crochet de déployer des fichiers, plutôt que de simplement définir des autorisations dans la copie de travail, vous pouvez déployer vers un emplacement temporaire puis utiliser rsync pour s'assurer que le contenu du fichier et les autorisations sont correctes.
Un peu plus sympa, mais nécessitant une infrastructure qui je suppose n'est pas en place, serait de s'assurer que le script de déploiement ne fonctionne que sous un seul utilisateur. Vous pouvez faire cela à l'aide de sudo, si vos administrateurs système, ou par la mise en place d'un serveur git service, comme gerrit, ou même en ayant un cron job exécuter toutes les cinq minutes qui vérifie les mises à jour et déploie si nécessaire.
Cela peut fonctionner:
C'est juste une variation de votre idée originale
Ok, un mélange de choses qui s'appuient sur les réponses précédentes:
vous pouvez définir le umask d'un dossier si vous le montez à fstab. Si vous pourriez convenir avec les gens à travailler sur le mont, vous pouvez appliquer g+w
Si vous définissez l'id groupe de bits de ce dossier (g+s) tous les fichiers appartiennent au groupe le dossier appartient à, si le groupe propriétaire du fichier propage
Est que c'est faisable? Bien sûr, l'application de ce point de montage n'est pas tâche facile. Toutes les meilleures idées autour de qui tout le monde?