web-dev-qa-db-fra.com

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

Je veux cd dans /var/named mais cela me donne une erreur d'autorisation refusée, et quand je veux utiliser Sudo pour le faire, je ne suis pas autorisé. Quelle en est la raison technique et est-il possible de procéder autrement?

166
Hojat Taheri

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 root

Sudo cd /path renvoie

Sudo: cd: command not found

parce que cd n'est pas un programme.

2

S'il était possible d'utiliser Sudo pour cd dans un répertoire protégé, 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 à se trouver dans ce répertoire.

Ce n'est pas possible.

Solution de contournement:

Vous pouvez utiliser Sudo -i pour vous élever au super utilisateur. Par exemple:

Sudo -i
cd /var/named 

Vous êtes maintenant connecté en tant que root et pouvez utiliser les commandes de votre choix. Une fois terminé, tapez exit et vous êtes de nouveau connecté en tant qu'utilisateur normal.

235
Warren Hill

En effet, cd n’est pas un exécutable, c’est une fonction du shell qui permet de changer de répertoire.

Si vous courez:

type cd

vous obtiendrez:

cd est une fonction shell

Vous pouvez utiliser Sudo -s pour ouvrir un shell interactif, puis cd dans le répertoire souhaité:

Sudo -s
cd /var/named

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

28
Basharat Sialvi

Toutes les réponses ci-dessus sont correctes. voici une solution de contournement si

Sudo sh -c "cd restricted-dir; some_command"
19
Tagar

Il convient également de rappeler que le statut de cdname __ en tant que binaire intégré à Shell ou en binaire externe, Sudo crée 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 très semblable à ceci:

  1. Le shell génère un sous-processus 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 sous-processus pour exécuter la commande spécifiée
  4. Sudo attend le sous-processus généré à l'étape 3 pour quitter
  5. Sudo sort et retourne à la coquille
  6. Le sous-processus généré à l'étape 1 se termine et renvoie l'utilisateur à l'invite du shell.

(This peut être techniquement légèrement incorrect; il existe un appel système qui remplace réellement le processus en cours avec un nouveau processus (c'est la execve() de la bibliothèque C. Cependant, pour les besoins de cette explication, les deux sont équivalents.)

Cela devient important lorsque vous considérez que le répertoire de travail actuel est une propriété de chaque processus et qu'il est hérité mais non promu . Donc, si le processus A génère un nouveau processus B, il commence par le même répertoire de travail que celui-ci. (C’est pourquoi une chose aussi banale que ls ./ fait ce que vous attendez.) Mais si le processus B change son répertoire de travail , à moins que le processus A ne le cherche, A ignore complètement ce changement. (C’est aussi pourquoi, si vous exécutez quelque chose comme find / et l’abandonnez à mi-parcours, vous ne vous retrouverez pas dans un emplacement apparemment aléatoire du système de fichiers simplement parce que find y a regardé au moment où il était avorté.)

Ainsi, même si Sudo cd /somewhere a fait exactement ce qui est écrit sur l'étain, au moment où Sudose termine, vous êtes ramené à votre point de départ. Par conséquent, du point de vue de l'utilisateur, cela devient un non-op. Le fait que cdname__, lors de son exécution, appelée la fonction de bibliothèque système chdir() pour définir un nouveau répertoire de travail, ne vous aide pas, l'utilisateur.

Comme Warren Hill a souligné, la solution appropriée (en fait, je n'appellerais pas cela une solution de contournement) consiste à utiliser Sudo -i qui vous dirige vers un shell racine où vous pouvez naviguer librement dans le système de fichiers et exécuter toutes les commandes que vous souhaitez. Notez cependant que lorsque vous quittez ce Shell, vous êtes toujours ramené à l’origine où vous avez commencé dans la hiérarchie des répertoires pour la même raison que celle décrite ci-dessus.

16
a CVn

Vous pouvez également modifier l'autorisation temporairement si vous êtes un utilisateur de Sudo.

Chemin sudo chmod 0775

ou

Sudo chmod + r folderpath

Assurez-vous de le remettre si nécessaire.

3
Andres Abello