Pourquoi 'sudo cd / var / named' ne fonctionne-t-il pas? [dupliquer]

154

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

    
posée Hojat Taheri 06.05.2013 - 21:02
la source

5 réponses

214

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 ne s'applique qu'aux programmes.

sudo foo signifie que vous exécutez le programme foo en tant que root

sudo cd /path renvoie

sudo: cd: command not found

car 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 à le faire. être dans ce répertoire.

Cela n'est pas possible.

Solution de contournement:

Vous pouvez utiliser sudo -i pour devenir un 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.

    
réponse donnée Warren Hill 06.05.2013 - 21:30
la source
25

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

Si vous exécutez:

type cd

votre volonté aura:

cd is a shell function

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 .

    
réponse donnée Basharat Sialvi 06.05.2013 - 21:29
la source
16

Il convient également de rappeler que, cd étant le statut de shell intégré ou de 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 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 génère un sous-processus pour exécuter la commande spécifiée
  4. sudo attend le sous-processus créé à l'étape 3 pour quitter
  5. sudo quitte en revenant au shell
  6. Le sous-processus créé à l'étape 1 se termine et renvoie l'utilisateur à l'invite du shell

(Ceci peut être techniquement légèrement incorrect; il existe un appel système qui remplace le processus en cours d'exécution par un nouveau (c'est le La bibliothèque% C_de%) de la bibliothèque C. Cependant, pour les besoins de cette explication, les deux sont équivalentes.)

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 execve() fait ce que vous attendez.) Mais si le processus B change son répertoire de travail, à moins que le processus A ne cherche cela, A n’a absolument pas conscience de ce changement. (Ceci explique pourquoi, si vous exécutez quelque chose comme ls ./ et que vous l’abandonnez à mi-chemin, vous ne vous retrouverez pas dans un emplacement apparemment aléatoire du système de fichiers simplement parce que find y a regardé pour le moment. il a été abandonné.)

Ainsi, même si find / a fait exactement ce qui est écrit sur l'étiquette, au moment où sudo cd /somewhere se sépare, vous êtes ramené à son point de départ. Par conséquent, du point de vue de l'utilisateur, cela devient un non-op. Le fait que sudo , pendant son exécution, appelée la fonction de bibliothèque système cd pour définir un nouveau répertoire de travail, ne vous aide pas, l'utilisateur.

Comme Warren Hill a souligné, la solution appropriée (je n'appellerais pas C’est une solution de contournement) d’utiliser chdir() qui vous mènera à un shell racine où vous pourrez naviguer librement dans le système de fichiers et exécuter toutes les commandes que vous voudrez. Notez cependant que lorsque vous quittez ce shell, vous êtes toujours ramené à la position de départ dans la hiérarchie des répertoires pour la même raison que celle décrite ci-dessus.

    
réponse donnée Michael Kjörling 07.05.2013 - 09:27
la source
15

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

sudo sh -c "cd restricted-dir; some_command"
    
réponse donnée Tagar 07.11.2015 - 07:00
la source
3

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

chemin sudo chmod 0775

ou

sudo chmod + r folderpath

Assurez-vous de le remettre si nécessaire.

    
réponse donnée Andres Abello 07.11.2016 - 18:14
la source

Lire d'autres questions sur les étiquettes