J'ai essayé d'utiliser sudo cd name_of_dir
mais j'obtiens le message d'erreur:
sudo: cd: command not found
Existe-t-il un autre moyen d’entrer dans un répertoire appartenant à un autre utilisateur disposant de l’autorisation de 700?
sudo cd
ne fonctionnera pas car la commande cd
est intégrée au shell. Donc, vous dites devenir root puis exécutez cette commande. Vous devenez root et ensuite la commande après sudo est recherchée mais il n'y a pas de commande cd
à rechercher.
La méthode à utiliser est de basculer vers l’utilisateur propriétaire du répertoire. La permission 700
signifie que "le propriétaire peut lire, écrire et exécuter".
Donc, si root possède le répertoire sudo -i
, password et que cd {dir}
est la seule méthode correcte. Si quelqu'un d'autre possède le répertoire, vous pouvez toujours utiliser la première méthode, mais vous pouvez également utiliser cet utilisateur avec su {username}
, puis utiliser cd
comme utilisateur.
sudo -i
pour ouvrir "console racine", puis
cd /path/to/directory
( cd
est une commande intégrée au shell, elle ne peut donc pas être la cible sudo)
Comme d'autres l'ont fait remarquer - c'est un shell intégré:
~ % which cd
cd: shell built-in command
Alors, pourquoi ne pas sudo le shell lui-même?
~ % sudo $SHELL -c "cd name_of_dir"
Vous pouvez également vous élever à l'utilisateur root par:
sudo -s
Ensuite, vous pouvez accéder à n’importe quel répertoire qui ne permet pas à un utilisateur normal de:
cd /root
Ou
cd /var/lib/
Ensuite, après avoir terminé, tapez:
exit
Déconnexion des privilèges d’utilisateur root.
Pour vous élever en tant que root, vous pouvez également combiner les deux commandes par l'opérateur &&
comme ci-dessous, cet opérateur conserve également sa séquence d'exécution, si la commande en cours s'exécute avec succès et que la prochaine commande est autorisée à exécuter: p>
sudo -s && cd /var/lib
Ou
sudo -s && cd /root
Si vous voulez vraiment faire fonctionner sudo cd directory
, vous pouvez définir une fonction bash
shell appelée sudo
qui exécute un nouveau shell root si elle est exécutée de cette manière, et exécute simplement la commande sudo
normale sinon.
Comme présenté dans d’autres réponses, la plupart des utilisateurs ne veulent pas vouloir le faire, mais souhaitent plutôt:
sudo -s
ou sudo -i
si vous voulez un shell de connexion (rappelez-vous que sudo -i
a pour effet de vous lancer dans le répertoire de base de root) ou sudo bash
si vous souhaitez forcer bash
ou être capable de passer des options au shell. cd directory
dans le nouveau shell. exit
pour quitter le nouveau shell. Il est important de ne pas l'oublier, car vous ne voulez pas effectuer plus d'actions en tant que root que vous ne le souhaitez! Donc, si vous le souhaitez, vous pouvez écrire une fonction shell (ou un script) qui exécute les deux premières actions lorsque sudo
est suivi de cd
et exécute simplement sudo
normalement autrement. Veuillez ne pas utiliser cette option pour apprendre pourquoi sudo cd
ne réussit pas autrement , car si vous ne comprenez pas ce qui se passe, vous serez probablement très confus en étant dans un nouveau shell (et vous ne pouvez pas comprendre les messages d'erreur qui se produisent).
Voici une façon d'écrire une telle fonction shell, qui vous rappelle également que vous êtes dans un nouveau shell et que vous devriez exit
en avoir terminé. (Ce rappel sera probablement utile pour les utilisateurs de tout niveau de compétence, car on n’a généralement pas l’habitude d’être dans un nouveau shell quand on exécute sudo
sans -s
, -i
ou le nom d'un shell réel en tant qu'argument.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "" = 'cd' ]; then
sudo bash -c '
if cd -- ""; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "[email protected]:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
[email protected]:~$ sudo -k # invalidates my current timestamp... like I left for a while
[email protected]:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
[email protected]:/root/.local#
[email protected]:/root/.local#
[email protected]:/root/.local# exit
exit
[email protected]:~$
" "$USER" "" >&2
printf "%s: Type \"exit\" once you are done!\n" "[email protected]:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
[email protected]:~$ sudo -k
[email protected]:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
[email protected]:~$
" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "" # Use as the dir in the intermediate shell, too.
else
command sudo "[email protected]"
fi
}
Vous pourriez mettre ceci dans votre ~/.bashrc
, bien que ce soit une manière assez étrange d'utiliser sudo
que vous ne voulez peut-être que l'activer de temps en temps. Dans ce cas, il vaut mieux le mettre dans son propre fichier. Si vous créez un fichier appelé sudo.bash
dans votre répertoire personnel avec ces contenus, vous pouvez rendre la fonction sudo
disponible - de sorte qu'elle s'exécute au lieu de la commande sudo
habituelle - en exécutant . ~/sudo.bash
. Cela prend effet dans le shell actuel et ses shells enfants, mais pas les autres. Pour la même raison que les fichiers tels que .bashrc
ne sont pas exécutables, ne marquez pas sudo.bash
exécutable avec chmod
. Ceci est vraiment une bibliothèque, plutôt qu'un script shell autonome. Si vous le exécutiez en tant que script shell, cela définirait la fonction ... mais uniquement dans le shell qui exécutait le script, pas pour vous en tant qu'appelant. (Bien sûr, vous pouvez écrire un script pour cela, ce n’est tout simplement pas l’approche que j’ai prise ici.)
Pour vérifier et voir si sudo
est actuellement défini comme une fonction shell, et pour voir sa définition actuelle si elle en est une, exécutez type sudo
. Pour désactiver la fonction une fois définie, exécutez unset -f sudo
. Pour exécuter manuellement la commande sudo
régulière directement, même si la fonction shell est définie, exécutez command sudo
. Notez, cependant, que vous n'avez pas à le faire, car cette fonction sudo
le fait lui-même quand il y a plus ou moins de deux arguments passés ou que le premier argument lui est passé. est autre chose que cd
. C'est pourquoi vous pouvez toujours l'utiliser de la manière habituelle que les gens utilisent sudo
.
Notez également que la fonction shell présentée ci-dessus vous permet toujours de transmettre d'autres arguments à sudo
, mais cela l'empêchera de traiter cd
spécialement . L'exécution de sudo -u user cd directory
en particulier n'est pas prise en charge, bien que vous puissiez étendre la fonction shell pour prendre en charge ce cas. % Co_de% n'est pas non plus. Le shell qu'il crée est similaire à celui obtenu avec sudo -i cd directory
. Le code n'exécute pas réellement sudo -s
, mais utilise sudo -s
, donc l'option sudo bash
fonctionne correctement. En fait, il exécute -c
deux fois lorsque vous lui transmettez bash
et un argument de répertoire (et zéro fois). Lorsque vous exécutez cd
, il lance d'abord un shell bash distinct de celui sur lequel vous exécutez la fonction sudo cd directory
et change de répertoire. Si cela réussit, il remplace ce shell bash par un nouveau, interactif, que vous pouvez utiliser.
Voici un exemple de la façon dont ce shell fonctionne automatiquement "fait le bon choix". Notez que sudo
se comporte normalement. Ce n'est que lorsque j'essaie de sudo ls -A /root
vers un répertoire avec cd
qu'un nouveau shell est créé, et on me rappelle explicitement ce qui se passe.
Si vous essayez de sudo
dans un répertoire que vous ne pouvez pas modifier en tant que root, vous obtiendrez simplement un message d'erreur:
J'ai utilisé sudo cd
entre les invocations dans les exemples ci-dessus pour montrer qu'il vous authentifie en tant que root avant d'essayer de changer de répertoire. Mais vous ne devez pas réellement exécuter sudo -k
vous-même. Dans la mesure où la fonction shell est simplement une enveloppe mince pour la vraie commande sudo -k
, la mise en cache de vos informations d'identification et d'autres comportements sudo
courants fonctionnent toujours normalement.
Bien que cela fonctionne bien et soit plutôt propre, j'admets que l'observation de la vraie commande sudo
avec une fonction du même nom est super étrange. La plupart des utilisateurs voudront probablement simplement effectuer les étapes sudo
, sudo -s
eux-mêmes. Mais au cas où quelqu'un le voudrait - et aussi pour démontrer que cela est possible - voilà.
En ce qui concerne le débat à su
ou pas à su
, je pense que c'est idiot. su
est contre la religion d'Ubuntu et ce n'est pas quelque chose à faire négligemment. C'est incroyable ce qu'un rm -rf *
peut faire si vous êtes root. Mais si vous êtes à l'aise avec l'interface de ligne de commande (CLI) et que vous avez des tâches à effectuer au niveau du système, il n'y a aucune raison de ne pas utiliser su
. J'ai utilisé plusieurs distributions où personne n'a mentionné l'utilisation de sudo
. C'est juste une question de quel type de travail vous faites et avec quelle méthode vous êtes le plus à l'aise. J'utilise les deux.
Lire d'autres questions sur les étiquettes command-line sudo permissions cd-command