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 directorybashsudosudo
Comme présenté dans d'autres réponses, la plupart des utilisateurs ne voudront pas le faire, mais voudront plutôt:
- Exécuter
sudo -sou sudo -isi vous voulez un shell de connexion (rappelez-vous qu’un des effets de sudo -iest de vous lancer dans le répertoire de base de la racine), ou sudo bashsi vous voulez forcer bashou 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
exitpour 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 sudoest suivi de cdet s'exécute sudonormalement 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 exitquitter 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 sudosans -s, -iou 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.bashdans votre répertoire de base avec ce contenu, vous pouvez alors rendre la sudofonction disponible - afin qu'elle s'exécute au lieu de la sudocommande 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 .bashrcne sont pas exécutables, ne marquez pas sudo.bashexé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 sudoest 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 sudocommande 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 sudofonction 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 cdspé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 directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo 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 /rootse 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 cdaccé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 -kentre 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 -kvous-même. Comme la fonction shell n’est qu’un cache-cache pour la sudocommande réelle , la mise en cache de vos informations d’identité et d’autres sudocomportements courants fonctionne toujours normalement.
Bien que cela fonctionne bien et qu’il soit plutôt ordonné, j’admets que masquer la vraie sudocommande 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 -ldes répertoires lui-même.