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:
sudo
. 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:
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
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