221 votes

Pourquoi `sudo cd /var/named` ne fonctionne-t-il pas?

Je veux cd dans /var/named mais cela me donne une erreur de permission refusée, et lorsque je veux utiliser sudo pour le faire je ne suis pas autorisé. Quelle est la raison technique de cela, et est-il possible de le faire d'une autre manière?

327voto

Warren Hill Points 21074

La raison pour laquelle vous ne pouvez pas faire cela est simple et double

1

cd n'est pas un programme mais une commande intégrée et sudo s'applique uniquement aux programmes.

sudo foo signifie exécuter le programme foo en tant que superutilisateur

sudo cd /chemin renvoie

sudo: cd: commande introuvable

parce que cd n'est pas un programme.

2

S'il était possible d'utiliser sudo pour cd vers un répertoire protégé alors après avoir exécuté la commande sudo cd /var/named vous seriez dans ce répertoire en tant qu'utilisateur normal mais les utilisateurs normaux ne sont pas autorisés à être dans ce répertoire.

Ceci n'est pas possible.

Solution de contournement :

Vous pouvez utiliser sudo -i pour vous élever en superutilisateur. Par exemple :

sudo -i
cd /var/named 

Vous êtes maintenant connecté en tant que root et pouvez utiliser n'importe quelle commande. Lorsque vous avez terminé, tapez exit et vous revenez à être connecté en tant qu'utilisateur normal.

31voto

th_in_gs Points 382

C'est parce que cd n'est pas un exécutable, c'est une fonction de shell pour changer de répertoire.

Si vous exécutez :

type cd

vous obtiendrez :

cd est une fonction de shell

Vous pouvez utiliser sudo -s pour ouvrir un shell interactif puis cd vers le répertoire désiré :

sudo -s
cd /var/named

Pour revenir à votre shell normal, appuyez simplement sur Ctrl+D.

26voto

Tagar Points 421

Toutes les réponses ci-dessus sont correctes; voici cependant une solution de contournement

sudo sh -c "cd restricted-dir; some_command"

18voto

akjain Points 351

Il est également bon de se rappeler que, le statut de cd en tant qu'interne à la coquille ou binaire externe mis à part, sudo fonctionne en lançant un nouveau processus pour exécuter la commande spécifiée.

Pourquoi est-ce important? Parce que le flux d'exécution de base de sudo devient quelque chose de très similaire à ceci:

  1. La coquille crée un processus enfant pour exécuter sudo avec les paramètres donnés
  2. sudo authentifie l'utilisateur et confirme son droit d'exécuter la commande spécifiée
  3. sudo crée un processus enfant pour exécuter la commande spécifiée
  4. sudo attend que le processus enfant créé à l'étape 3 se termine
  5. sudo quitte, revenant à la coquille
  6. Le processus enfant créé à l'étape 1 se termine, ramenant l'utilisateur à l'invite de commande de la coquille

(Cela peut être techniquement légèrement incorrect; il y a un appel système qui remplace en fait le processus en cours par un nouveau (c'est la fonction execve() de la bibliothèque C). Cependant, aux fins de cette explication, les deux sont équivalents.)

Ceci devient important lorsque l'on considère que le répertoire de travail actuel est une propriété de chaque processus et est héritée mais pas promue. Donc si le processus A crée un nouveau processus B, alors le processus B démarre avec le même répertoire de travail que le processus A. (C'est pourquoi quelque chose d'aussi banal que ls ./ fait ce à quoi vous vous attendez.) Mais si le processus B change son répertoire de travail, alors à moins que le processus A aille spécifiquement le chercher, A est complètement inconscient de ce changement. (C'est pourquoi si vous exécutez quelque chose comme find / et l'interrompez en cours de route, vous ne vous retrouvez pas dans un endroit apparemment aléatoire dans le système de fichiers juste parce que find était en train de chercher là à ce moment-là lorsque vous l'avez arrêté.)

Donc même si sudo cd /quelquepart faisait exactement ce qu'il dit sur l'étain, à l'heure où sudo se termine, vous êtes ramené exactement là où vous avez commencé. Par conséquent, du point de vue de l'utilisateur, il devient une opération sans effet. Le fait que cd, pendant qu'il était en cours d'exécution, a appelé la fonction de bibliothèque système chdir() pour définir un nouveau répertoire de travail, ne vous aide pas, en tant qu'utilisateur.

Comme Warren Hill l'a souligné, la solution appropriée (je ne l'appellerais pas vraiment un contournement) est d'utiliser sudo -i qui vous place dans une coquille root où vous pouvez naviguer librement dans le système de fichiers et exécuter les commandes que vous souhaitez. Notez cependant que lorsque vous quittez cette coquille, vous êtes toujours ramené exactement là où vous avez commencé dans la hiérarchie des répertoires pour exactement la même raison que celle que j'ai décrite plus haut.

4voto

Andres Abello Points 41

Vous pouvez également modifier temporairement les permissions si vous êtes un utilisateur sudo.

sudo chmod 0775 chemin

ou

sudo chmod +r chemin_du_dossier

Assurez-vous de le remettre en place si nécessaire.

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