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".
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.
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
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.
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"
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
.
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