web-dev-qa-db-fra.com

Créer des fichiers et des répertoires avec un certain propriétaire (utilisateur / groupe) tout en se rapprochant

J'ai besoin de wget quelque chose (le résultat est un fichier compressé dans cwd), puis je dois l'extraire, puis faire quelques trucs de copie/déplacement/modification et éventuellement exécuter un script (à partir de l'archive téléchargée).

Désormais, toutes ces tâches directement (wget, extraire, etc.) ou indirectement (exécution du script) entraînent la création de fichiers et de répertoires (le tout dans le répertoire de travail en cours). Je fais tous ces trucs comme root (aucun moyen de le faire avec l'utilisateur final souhaité).

Le problème est le suivant: tout ce qui est créé dans le processus appartient à l'utilisateur root ou à l'utilisateur sudo. Lorsque j'ai terminé (et parfois à mi-chemin), je dois émettre une série de commandes chmod et chown pour arranger les choses.

Maintenant, il serait bien de pouvoir dire au système que "À partir de maintenant, tous les fichiers ou répertoires que vous créez lorsque je lance des commandes en tant que root, vous les créez avec telle ou telle propriété et ces mêmes autorisations".

20
Ashkan Kh. Nazary

Vous pouvez toujours Sudo -u username touch filename lorsque votre script est exécuté sous la forme root. Il ne nécessite généralement pas de mot de passe, en fonction de votre configuration sudoers.

Sinon, exécutez su username -c touch filename. Les arguments supplémentaires sont fournis au shell de l'utilisateur et l'option -c au shell exécute les commandes spécifiées par convention.


Certaines commandes (telles que mkdir) prennent en charge les arguments permettant de spécifier les autorisations:

mkdir -m 0700 foo

Par défaut, les opérations sur les fichiers respectent la valeur umask définie pour le shell. Il définit quelles autorisations sont refusées . Un umask de 0022 par exemple ne ne définit pas les autorisations d'écriture pour le groupe et les autres. Définissez sur 0077 pour empêcher le groupe et les autres utilisateurs d'obtenir des autorisations.


Vous pouvez définir la setgid sur les répertoires pour que tous les fichiers créés au sein héritent de leur appartenance à un groupe:

chmod g+s someDir

Certains Unix supportent le même comportement pour setuid (chmod u+s), mais pas Linux.

23
Daniel Beck

Il y a une autre façon, assez élégante je pense. Utilisation de install (1)

Par exemple, zabbix-agentd a besoin d’un sous-dossier dans/var/run, mais les distributions récentes utilisent tmpfs pour/var/run, de sorte que le répertoire ne survivra pas aux redémarrages. Je l'ai résolu en créant un fichier/etc/sysconfig/zabbix-agentd contenant:

install -g zabbix -o zabbix -d /var/run/zabbix
8
Angelo Turetta

Sur les systèmes de type Unix, les fichiers et les répertoires nouvellement créés appartiennent au propriétaire du processus qui les a créés. Les utilitaires standard n’ont normalement pas d’option pour changer le propriétaire des fichiers créés.

Variables avec UID et GID de l'utilisateur d'origine

Si vous exécutez plusieurs commandes à plusieurs reprises, vous pouvez utiliser les variables $Sudo_UID et $Sudo_GID pour faire référence à l'utilisateur qui a appelé Sudo:

Sudo sh -c "do_something ; chown -R \"\$Sudo_UID:\$Sudo_GID\" files and directories"

Obtenir automatiquement la liste des fichiers et répertoires créés

Si vous souhaitez obtenir automatiquement la liste des fichiers et des répertoires créés (et éventuellement modifiés), vous pouvez exécuter vos commandes sous surveillance strace qui est basée sur l'appel système ptrace():

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

ou vous pouvez utiliser par exemple Installwatch qui repose sur le mécanisme LD_PRELOAD.

Idées de travail ultérieur

Sur la base des méthodes mentionnées ci-dessus, il est possible de créer un outil qui changerait automatiquement le propriétaire et éventuellement les droits d'accès aux fichiers créés/modifiés. L'utilisation pourrait être aussi simple que:

Sudo watch-chown do_something
3
pabouk