Si vous voulez vraiment faire fonctionner, vous pouvez définir une fonction shell appelée qui exécute un nouveau shell racine lorsqu'elle est exécutée de cette façon . Sinon , elle exécute simplement la commande standard .sudo cd directory
bash
sudo
sudo
Comme présenté dans d'autres réponses, la plupart des utilisateurs ne voudront pas le faire, mais voudront plutôt:
- Exécuter
sudo -s
ou sudo -i
si vous voulez un shell de connexion (rappelez-vous qu’un des effets de sudo -i
est de vous lancer dans le répertoire de base de la racine), ou sudo bash
si vous voulez forcer bash
ou pouvoir passer des options au shell.
- Exécuter dans le nouveau shell.
cd directory
- Effectuez toutes les actions (autres) qui doivent être prises en tant que racine dans le nouveau shell.
- Une fois cela fait, lancez
exit
pour quitter le nouveau shell. Il est important de ne pas l'oublier car vous ne voulez pas exécuter plus d'actions en tant que root que vous ne le souhaitez!
Donc, si vous le souhaitez, vous pouvez alors écrire une fonction shell (ou un script) qui effectue les deux premières de ces actions lorsque sudo
est suivi de cd
et s'exécute sudo
normalement normalement. Veuillez ne pas utiliser ceci comme une alternative à l’apprentissage de la raison pour laquelle voussudo cd
ne réussissez 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 risquez de ne pas comprendre les messages d’erreur). qui se produisent).
Voici un moyen d'écrire une telle fonction shell, qui vous rappelle également que vous êtes dans un nouveau shell et que vous devriez le exit
quitter lorsque vous avez terminé. (Ce rappel est susceptible d'être utile pour les utilisateurs de tout niveau de compétence, parce que l' on est généralement pas l' habitude d'être dans une nouvelle coque quand on court sudo
sans -s
, -i
ou le nom d'une coquille réelle comme argument.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
Vous pouvez le mettre dans votre ~/.bashrc
, bien que ce soit une façon assez étrange de l'utiliser sudo
, vous voudrez peut-être seulement l'activer occasionnellement. Dans ce cas, il est préférable de le mettre dans son propre fichier. Si vous créez un fichier appelé sudo.bash
dans votre répertoire de base avec ce contenu, vous pouvez alors rendre la sudo
fonction disponible - afin qu'elle s'exécute au lieu de la sudo
commande normale - en exécutant . ~/sudo.bash
. Cela prend effet dans le shell actuel et ses shell enfants, mais pas les autres. Pour la même raison que des fichiers tels que .bashrc
ne sont pas exécutables, ne marquez pas sudo.bash
exécutable avec chmod
. Il s’agit vraiment d’une bibliothèque plutôt que d’un script shell autonome. Si vous avez faitl'exécuter en tant que script shell, il définirait la fonction ... mais uniquement dans le shell qui a exécuté 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 adoptée ici.)
Pour vérifier et voir si sudo
est actuellement définie en tant que fonction shell et pour voir sa définition actuelle, le cas échéant, exécutez type sudo
. Pour désactiver (c'est-à-dire annuler la définition) la fonction une fois définie, exécutez unset -f sudo
. Pour exécuter manuellement la sudo
commande standard directement, même si la fonction shell est définie, exécutez command sudo
. Notez, cependant, que vous ne devez le faire, parce que cette sudo
fonction ne fait que lui - même chaque fois qu'il ya plus ou moins de deux arguments passés ou le premier argument passé à c'est tout sauf cd
. C'est pourquoi vous pouvez toujours l'utiliser de la manière habituelle sudo
.
Notez aussi que la fonction shell montrée ci-dessus vous permet toujours de passer d'autres arguments à sudo
, mais cela l'empêchera de traiter cd
spécialement . L'exécution en particulier n'est pas prise en charge, bien que vous puissiez étendre la fonction shell pour prendre en charge ce cas. Ni est . Le shell qu'il crée est similaire à ce que vous obtenez . Le code ne s'exécute pas réellement , mais utilise , donc l' option fonctionne correctement. En fait, il s'exécute deux fois lorsque vous passez un argument de répertoire (et zéro fois sinon). Lorsque vous l'exécutez , il crée d'abord un shell bash distinct de celui dans lequel vous exécutez la fonction et change le répertoire. Si cela réussit, il remplacesudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
ce shell bash avec un nouveau, interactif que vous pouvez utiliser.
Voici un exemple de la façon dont ce shell fonctionne automatiquement "fait la bonne chose". Notez que sudo ls -A /root
se comporte normalement. Un nouveau shell est alors créé uniquement lorsque je tente d' accéder cd
à un répertoire sudo
, et on me rappelle explicitement ce qui se passe.
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
Si vous essayez d' sudo cd
accéder à un répertoire que vous ne pouvez pas modifier même en tant que root, vous obtiendrez simplement un message d'erreur:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
J'ai utilisé sudo -k
entre les appels dans les exemples ci-dessus pour montrer qu'il vous authentifie en tant que root avant de tenter de changer de répertoire. Mais vous n'êtes pas obligé de courir sudo -k
vous-même. Comme la fonction shell n’est qu’un cache-cache pour la sudo
commande réelle , la mise en cache de vos informations d’identité et d’autres sudo
comportements courants fonctionne toujours normalement.
Bien que cela fonctionne bien et qu’il soit plutôt ordonné, j’admets que masquer la vraie sudo
commande avec une fonction du même nom est très bizarre. La plupart des utilisateurs voudront probablement exécuter les étapes eux sudo -s
- mêmes. Mais au cas où quelqu'un le voudrait - et aussi pour démontrer que c'était possible - le voilà.cd directory
ls -l
des répertoires lui-même.