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?
La raison pour laquelle vous ne pouvez pas faire cela est simple et double
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.
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.
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.
Toutes les réponses ci-dessus sont correctes. voici une solution de contournement si
Sudo sh -c "cd restricted-dir; some_command"
Il convient également de rappeler que le statut de cd
name __ 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:
(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ù Sudo
se 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 cd
name__, 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.
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.