Création de fichiers et de répertoires avec un certain propriétaire (utilisateur / groupe) pendant le sudoing

22

J'ai besoin de wgetquelque chose (résulte en un fichier compressé dans cwd), puis je dois l'extraire, puis faire des trucs de copie / déplacement / modification et peut-être enfin exécuter un script (à partir de l'archive téléchargée).

Maintenant, toutes ces tâches, directement ( wgetextraire, etc.) ou indirectement (exécuter le script), entraînent la création de fichiers et de répertoires (tous dans le répertoire de travail actuel). Je fais tout ça root(pas moyen de le faire avec l'utilisateur final souhaité).

Le problème est le suivant: tout ce qui est créé dans le processus appartient à root ou à l'utilisateur sudo. Quand j'ai fini (et parfois à mi-chemin), je dois émettre une série de commandes chmodet chownpour faire les choses correctement.

Maintenant, ce serait bien de pouvoir dire au système que "Désormais, tous les fichiers ou répertoires que vous créez lorsque j'émets des commandes en tant que root, vous les créez avec telle ou telle propriété et autorisations".

Ashkan Kh. Nazary
la source

Réponses:

26

Vous pouvez toujours sudo -u username touch filenamequand votre script est exécuté en tant que root. Il ne nécessite généralement pas de mot de passe, selon votre sudoersconfiguration.

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


Certaines commandes (comme mkdir) prennent en charge les arguments pour spécifier les autorisations:

mkdir -m 0700 foo

Par défaut, les opérations sur les fichiers respectent l' umaskensemble du shell. Il définit quelles autorisations sont refusées . A umaskde 0022par exemple , ne pas les permissions d'écriture pour le groupe ensemble et d' autres. Définissez sur 0077pour empêcher le groupe et les autres d'obtenir des autorisations.


Vous pouvez définir les setgidrépertoires on pour que tous les fichiers créés dans héritent de leur appartenance au groupe:

chmod g+s someDir

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

Daniel Beck
la source
1
Je pense qu'il est prudent de supposer qu'il n'y a pas de support dédié pour ce que vous demandez. Seul le super utilisateur peut chowndéposer des fichiers vers un autre utilisateur, et définir une valeur par défaut comme celle-ci a le potentiel d'erreurs de l'utilisateur, donnant aux autres utilisateurs des autorisations sans que l' rootutilisateur ne s'en rende compte.
Daniel Beck
10

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

Par exemple, zabbix-agentd a besoin d'un sous-dossier dans / var / run, mais les distributions récentes utilisent tmpfs pour / var / run, donc le répertoire ne survit 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
Angelo Turetta
la source
1
Ajoutez également -m 0700par exemple. La réponse.
Anneau Ø
3
Notez que installcrée le répertoire , puis change le propriétaire / groupe. Il y a donc un court laps de temps où le répertoire n'a pas le propriétaire / groupe spécifié. Dans certains contextes, cela peut être important.
user368507
Cela fonctionne sur Alpine Linux
Mauricio Sánchez
3

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

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

Si vous exécutez certaines commandes à plusieurs reprises, vous pouvez utiliser les variables $SUDO_UIDet $SUDO_GIDfaire référence à l'utilisateur qui a appelé sudo:

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

Obtention automatique de la liste des fichiers et répertoires créés

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

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

ou vous pouvez utiliser par exemple Installwatch qui est basé sur le LD_PRELOADmécanisme.

Idées de travaux futurs

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 des fichiers créés / modifiés. L'utilisation pourrait être aussi simple que:

sudo watch-chown do_something
pabouk
la source