8 votes

Pourquoi ne peut pas "sudo cp" trouver les fichiers ?

Qui peut me donner une explication logique à ce problème:

Je ne peux pas exécuter cette commande:

sudo cp /data/*20150522* /backup/

cp: cannot stat `/data/*20150522*': No such file or directory

Et quand je passe en root, ça fonctionne sans problème.

Je suis sûr que c'est une question de droits pour lister les fichiers à l'intérieur du répertoire /data qui ont les privilèges d'accès suivants:

drwxrwx--- 1 root root 

Mais ici je lance la commande avec sudo, alors quel est le problème ici?

19voto

jxh Points 313

Le shell tente d'élargir le motif glob avant de passer le résultat élargi à cp (en fait, il passe le résultat à sudo qui le transmet ensuite inchangé à cp). Puisque le shell (il s'exécute en tant que vous, pas en tant que root) n'est pas capable de parcourir le répertoire, cp finit par recevoir le motif non élargi dans sa liste d'arguments.

cp ne réalise aucune expansion de glob par lui-même. Il attend une liste de noms de fichiers. La chaîne avec le motif ne nomme pas un fichier.

Peut-être la manière la plus directe de réaliser la tâche est d'invoquer votre commande dans un sous-shell. Citez la commande avec soit des guillemets doubles (") ou simples (').

sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'

Cela fonctionne car le sous-shell élargit le motif glob dans la chaîne de commande avant d'invoquer la commande. Puisque le sous-shell s'exécute en tant que root sous sudo, l'expansion réussit.

Utiliser des guillemets doubles pour citer la commande au sous-shell permet au shell parent d'élargir les variables du shell avant d'invoquer la commande sudo. Si vous souhaitez que les variables soient élargies par le sous-shell, les guillemets simples doivent être utilisés à la place. Dans ce cas, c'est équivalent, car vous n'avez pas de variables. Mais, vous pourriez en ajouter une pour voir la différence de comportement.

sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'

La première commande affichera votre nom d'utilisateur, tandis que la deuxième commande affichera le nom de l'utilisateur root.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X