Si je fais un sudo cp /etc/foo.txt ~/foo.txt
, le nouveau fichier est créé avec root
comme propriétaire.
Pour l'instant, je ne vois pas d'autre moyen que d'utiliser les deux dernières commandes ( 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:
- Le faire en une seule
sudo
commande. - Ne pas avoir à spécifier mon utilisateur actuel (peut-être en utilisant une variable?).
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.Réponses:
Utilisez
install
au lieu decp
:la source
install
. Je vous remercie.sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Avec un compatible POSIX
cp
, vous pouvezsudo cp -p foo bar
pour préserver les métadonnées de fichier suivant lors de la copie:Si vous souhaitez définir un autre utilisateur, la solution de JennyD est la meilleure.
la source
sudo
de copier un fichier que vous ne possédez pas. Vous avez juste besoin d'un accès en lecture , après tout.Si tu fais:
Ensuite,
~/foo.txt
il sera ouvert par le shell pendant que vous (créé avec vos informations d'identification), puissudo
sera exécuté avec sa sortie standard redirigée vers cela.À la fin, le fichier vous appartiendra.
Ce type d'approche permet également de limiter les tâches effectuées par
root
. Ici,root
n'utilise que son privilège pour s'ouvrir/etc/foo.txt
, il ne fait pas ce qui est potentiellement dangereux (ouvrir un fichier en écriture, cela pourrait avoir de mauvaises conséquences s'il~/foo.txt
s'agissait d'un lien symbolique par exemple).la source
À l'aide de
sudo
, vous basculez vers un autre utilisateur. C'est tout l'intérêt de la commande. Je suppose que vous n'avez pas d'accès régulier au premier fichier, vous devez donc être un autre utilisateur (root
dans ce cas) pour y accéder.Il n'y a aucun moyen pour
sudo
lui de gérer cela, car toutsudo
ce que vous faites est de vous basculer vers l'autre utilisateur pour exécuter la commande.Tu devras
sudo
.la source
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.
(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'utilisels
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
la source