Sudo crée une variable d'environnement "SUDO_USER" que vous pouvez utiliser pour trouver l'utilisateur qui s'est connecté (en fait, qui a exécuté Sudo).
En supposant que vous Sudo pour rooter (il est possible d'utiliser Sudo pour accéder à d'autres utilisateurs aussi), vous pouvez écrire un script pour automatiser les deux étapes suivantes.
cp source target
chown $SUDO_USER target
(Cela ne fonctionnera pas si vous faites un sudo à un utilisateur non root car seul root peut donner des fichiers.)
L'automatiser sera un peu de travail. Si la source est un fichier unique et la cible n'est pas un répertoire, alors votre travail est terminé. Je suppose que vous avez posé la question parce que le problème n'est un vrai problème que dans des situations plus complexes, par exemple lorsque vous faites quelque chose comme:
cp /path/source/some*files /path/target/directory/
Un script complexe pour déterminer quels fichiers et quels répertoires sont passés, lesquels étaient préexistants, lesquels ont été réellement remplacés et pour changer la propriété des seuls fichiers copiés avec succès pourrait être écrit.
Ce travail a déjà été fait. Vous pouvez utiliser cpio
- Après sudo pour rooter, utilisez cpio pour copier les fichiers. cpio a besoin d'une liste des fichiers à copier, c'est donc un processus en deux étapes. Ci-dessous, j'utilise ls
pour générer la liste des fichiers à copier.
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
Le -pdm
moyen "Mode passthrough, Créer des répertoires selon les besoins, Maintenir les temps de modification des fichiers"
--owner $SUDO_USER"
oblige l'utilisateur spécifié à posséder les fichiers.
L'opérande final est le répertoire où cpio doit stocker les fichiers.
Pour en savoir plus sur le caractère génial de cpio, consultez la page de manuel CPIO ici
Faire cela dans une seule commande sudo est également possible. En supposant que votre utilisateur dispose des droits d'accès aux fichiers, utilisez sudo uniquement pour la partie cpio, comme ceci:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
Dans le cas ci-dessus, j'utilise $ USER au lieu de $ SUDO_USER car il est évalué avant l'exécution de Sudo. Sinon, si l'utilisateur n'a pas accès à la liste des fichiers, placez-le dans un script d'encapsuleur et utilisez sudo pour exécuter l'encapsuleur. Cela peut devenir plus difficile, mais dans le cas le plus simple, l'encapsuleur prend deux arguments, une source et une cible.
Cela va dans le wrapper "cp_as_user":
ls $1 | cpio -pdm --owner $SUDO_USER $2
Ensuite, utilisez le wrapper comme ceci:
sudo cp_as_user "/ chemin / vers / certains * fichiers" / chemin / vers / cible / répertoire
sudo cat /etc/foo.txt > ~/foo.txt
. Les fichiers ont tendance à être uniquement lisibles par root pour une raison, alors n'oubliez pas de garder cette raison à l'esprit lorsque vous faites des copies lisibles par des utilisateurs non root.