Question Pourquoi `sudo cd / var / named` ne fonctionne pas? [dupliquer]


Cette question a déjà une réponse ici:

je veux cd dans /var/named mais cela me donne une erreur refusée, et quand je veux utiliser sudo pour ce faire, je ne suis pas autorisé. Quelle est la raison technique de cela et est-il possible de le faire autrement?


148
2018-05-06 19:02


origine




Réponses:


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 résultats

sudo: cd: command not found

car cd n'est pas un programme.

2

S'il était possible d'utiliser sudo à cd dans un répertoire protégé ayant ensuite 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. Quand fini type exit et vous êtes de nouveau connecté en tant qu’utilisateur normal.


206
2018-05-06 19:30



Techniquement cd est à la fois une commande intégrée et une commande externe. unix.stackexchange.com/questions/50058/… - kojiro
@kojiro Ubuntu ne le fait pas; au moins dans une installation propre; avoir /usr/bin/cd seul le construit - Warren Hill
Concernant le point 2: si vous sudo -i (ou sudo su) puis cd /var/named et alors su normaluser... peux-tu faire ça? - Alvin Wong
@AlvinWong Pourquoi ne pas l'essayer et le découvrir? Juste testé si vous sudo -i puis cd dans un répertoire, vous ne devriez pas être dans le su normal_user puis pwd montre que vous êtes dans le répertoire protégé mais ls ne marche pas ls: cannot open directory.: permission denied - Warren Hill
Solution de contournement a travaillé. - Nino Škopac


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

Si vous courez:

type cd

vous aurez:

cd est une fonction shell

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

sudo -s
cd /var/named

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


25
2018-05-06 19:29





Il convient également de rappeler que, cdle statut de shell en tant que shell intégré ou externe, sudo fonctionne en cré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 très similaire à ceci:

  1. Le shell lance 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, revenant à la coque
  6. Le sous-processus généré à l'étape 1 se termine, renvoyant l'utilisateur à l'invite du shell

(Ce mai être techniquement légèrement incorrect il y a un appel système qui en fait remplace le processus en cours avec un nouveau (c'est la bibliothèque de C execve()). Cependant, aux fins 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 est hérité mais non promu. Donc, si le processus A déclenche un nouveau processus B, alors le processus B commence avec le même répertoire de travail que celui dans lequel le processus A se trouvait. (C'est pourquoi quelque chose d'aussi banal que ls ./fait ce que vous attendez.) Mais si le processus B change ses répertoire de travail, à moins que le processus A ne soit pas à sa recherche, A ignore complètement ce changement. (Ceci, à son tour, est pourquoi si vous exécutez quelque chose comme find / et abandonnez-le à mi-chemin, vous ne vous retrouvez pas dans un emplacement apparemment aléatoire dans le système de fichiers simplement parce que la recherche a eu lieu à regarder au moment où il a été annulé.)

Donc même si sudo cd /somewhere a fait exactement ce qu'il dit sur la boîte, au moment où sudo vous quitte, vous êtes ramené directement où vous avez commencé. De ce fait, du point de vue de l'utilisateur, cela devient un non-op. Le fait que cd, pendant son exécution, a appelé le chdir() La fonction de bibliothèque système pour définir un nouveau répertoire de travail ne vous aide pas, l'utilisateur.

Comme Warren Hill souligné, la bonne solution (En fait, je ne l'appellerais pas une solution de contournement) est d'utiliser sudo -i ce qui vous amène à un shell racine où vous pouvez naviguer librement dans le système de fichiers et exécuter les commandes qui vous intéressent. Notez cependant que lorsque vous quittez ce shell, vous êtes encore ramené là où vous avez commencé dans la hiérarchie des répertoires pour exactement la même raison que celle décrite ci-dessus.


16
2018-05-07 07:27



Cette explication était sympa et ton petit mot sur "Donc même si sudo cd /somewhere a fait exactement ce qu'il dit sur la boîte, au moment où sudo quitte, vous êtes ramené où vous avez commencé. "était utile. +1 - harperville


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

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

12
2017-11-07 06:00



J'aime mieux cette solution parce que vous faites vos trucs racine, puis revenez immédiatement au mode non-root pour ne pas oublier et faire de grosses erreurs. - GlenPeterson


Vous pouvez également modifier l'autorisation temporairement. chmod 0775 chemin. Assurez-vous de le remettre si nécessaire.


3
2017-11-07 17:14



Bienvenue sur Ask Ubuntu! je recommande modifiercette réponse pour le développer avec des détails spécifiques sur la façon de le faire. (Voir également Comment écrire une bonne réponse? pour des conseils généraux sur les types de réponses les plus utiles sur AskUbuntu.) - David Foerster
Je n'ai pas le droit de lancer un shell interactif avec sudo, c'est donc la voie à suivre. - Guillaume