Existe-t-il un moyen de dire à sudo de définir mon nom d'user comme propriétaire des files créés à la place de root?

Si je fais un sudo cp /etc/foo.txt ~/foo.txt , le nouveau file est créé avec root tant que propriétaire.

En ce moment, je ne vois pas d'autre solution que d'utiliser les deux dernières commands ( ls pour clarifier le cas d'utilisation):

 belmin@server1$ ls /etc/foo.txt > -rw------- 1 root root 3848 Mar 6 20:35 /etc/foo.txt > belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt belmin@server1$ sudo chown belmin: $_ 

Je préférerais:

  1. Le faire dans une command sudo .
  2. Ne pas avoir à spécifier mon user actuel (peut-être en utilisant une variable?).

Utilisez install au lieu de cp :

 sudo install -o belmin /etc/foo.txt ~/foo.txt 

Avec un cp compatible POSIX, vous pouvez sudo cp -p foo bar pour conserver les métadonnées de file suivantes lors de la copy:

  • Temps d'access
  • Temps de modification
  • Identifiant d'user
  • ID du groupe
  • Mode

Si vous souhaitez définir un user différent, la solution de JennyD est la meilleure.

Si tu fais:

 sudo cat /etc/foo.txt > ~/foo.txt 

Alors ~/foo.txt sera ouvert par le shell comme vous (ainsi créé avec vos informations d'identification), puis sudo sera exécuté avec sa stdout redirigée vers celui-ci.

En fin de count, le file sera la propriété de vous.

Ce type d'approche permet également de limiter les tâches effectuées par root . Ici, root n'utilise que son privilège pour ouvrir /etc/foo.txt , il ne fait pas ce qui est potentiellement dangereux (ouvrir un file pour écrire, cela pourrait avoir de mauvaises conséquences si ~/foo.txt était un lien symbolique par exemple ).

En utilisant sudo , vous basculez vers un autre user. C'est tout le sharepoint la command. Je suppose que vous n'avez pas d'access régulier au premier file, vous devez donc être un autre user ( root dans ce cas) pour avoir access.

Il n'y a aucun moyen pour sudo de gérer cela, puisque tout sudo est en train de vous faire passer à l'autre user pour exécuter la command.

Tu devras

  1. continuez à utiliser deux commands (ou une command composée)
  2. find une autre command (comme installer, vu dans une autre réponse)
  3. ou écrire un script et exécuter ce script via sudo .

Sudo crée une variable d'environnement "SUDO_USER" que vous pouvez utiliser pour find l'user qui s'est connecté (en fait, qui a dirigé Sudo).

En supposant que vous avez Sudo à rooter (il est possible d'utiliser Sudo pour accéder à d'autres users), vous pouvez écrire un script pour automatiser les deux étapes suivantes.

 cp source target chown $SUDO_USER target 

(Cela ne fonctionnera pas si vous avez un user non root car seul le root peut donner des files.)

L'automatiser sera un peu de travail. Si la source est un seul file et que la cible n'est pas un directory, votre travail est terminé. Je suppose que vous avez posé la question parce que le problème n'est réel 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 files et quels directorys sont passés, lesquels étaient préexistants, lesquels ont été écrasés, et pour modifier la propriété des files copiés avec succès, peuvent être écrits.

Ce travail a déjà été fait. Vous pouvez utiliser cpio – Après sudo pour rooter, utilisez cpio pour copyr les files. cpio a besoin d'une list des files à copyr, donc c'est un process en deux étapes. Ci-dessous j'utilise ls pour générer la list des files à copyr.

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

Le -pdm signifie "mode Passthrough, créer des directorys au besoin, maintenir les time de modification des files"

--owner $SUDO_USER" amène l'user spécifié à posséder les files.

L'opérande final est le directory dans lequel cpio doit stocker les files.

Pour en savoir plus sur cpio awesomeness, rendez-vous sur la page de manuel de CPIO ici

Faire cela dans une seule command sudo est également possible. En supposant que votre user ait le droit d'accéder aux files, 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 que Sudo ne s'exécute. Sinon, si l'user n'a pas access à la list des files, mettez-le dans un script wrapper et utilisez sudo pour exécuter l'encapsuleur. Cela peut devenir plus difficile, mais dans le cas le plus simple Le wrapper 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 l'emballage comme ceci:

sudo cp_as_user "/ path / vers / certains files *" / path / to / target / directory