J'ai essayé d'utiliser Sudo cd name_of_dir
mais je reçois le message d'erreur suivant:
Sudo: cd: command not found
Existe-t-il un autre moyen de saisir un répertoire appartenant à un autre utilisateur disposant de 700 autorisations?
Sudo cd
ne fonctionnera pas car la commande cd
est intégrée au shell. Donc, vous dites devenir root et ensuite exécuter cette commande. Vous devenez root, puis la commande après la recherche de Sudo est recherchée, mais il n'y a pas de commande cd
à rechercher.
La méthode à utiliser consiste à basculer vers l'utilisateur qui possède le répertoire. L'autorisation 700
signifie que "le propriétaire peut lire, écrire et exécuter".
Donc, si root possède le répertoire Sudo -i
, password, puis cd {dir}
est la seule méthode correcte. Si quelqu'un d'autre est propriétaire du répertoire, vous pouvez toujours utiliser la 1ère méthode, mais vous pouvez également remplacer cet utilisateur par su {username}
et utiliser ensuite cd
en tant qu'utilisateur.
Sudo -i
pour ouvrir "console root" puis
cd /path/to/directory
(cd
est une commande intégrée du shell, il ne peut donc s'agir de la cible Sudo)
Pour ouvrir un répertoire racine, nous pouvons exécuter un shell racine, par exemple:
Sudo su
# cd /root
Comme d'autres l'ont fait remarquer, Shell est intégré:
~ % which cd
cd: Shell built-in command
Alors, pourquoi ne pas Sudo la coquille elle-même?
~ % Sudo $Shell -c "cd name_of_dir"
Vous pouvez également vous élever comme utilisateur root en:
Sudo -s
Ensuite, vous pouvez vous connecter à n’importe quel répertoire qui ne permet pas à un utilisateur normal comme:
cd /root
Ou
cd /var/lib/
Ensuite, une fois que vous avez terminé, tapez:
exit
Pour vous déconnecter des privilèges de l'utilisateur root.
Pour vous élever en tant que root, vous pouvez également combiner les deux commandes avec l'opérateur &&
comme ci-dessous. Cet opérateur conserve également leur séquence d'exécution. Si la commande actuelle s'exécute correctement, la commande suivante est alors autorisée à être exécutée:
Sudo -s && cd /var/lib
Ou
Sudo -s && cd /root
Si vous voulez vraiment que Sudo cd directory
fonctionne, vous pouvez définir une fonction Shell bash
___ nommée Sudo
qui exécute un nouveau shell racine lorsqu’elle est exécutée de cette façon, et exécute simplement la commande normale Sudo
name__.
Comme présenté dans d'autres réponses, la plupart des utilisateurs ne voudront pas vouloir le faire, mais voudront plutôt:
Sudo -s
ou Sudo -i
si vous voulez un shell de connexion (rappelez-vous que l'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 transmettre 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!Ainsi, si vous le souhaitez, vous pouvez écrire une fonction Shell (ou un script) qui exécute les deux premières de ces actions lorsque Sudo
est suivi de cd
et exécute simplement Sudo
normalement. Veuillez ne pas utiliser ceci comme alternative à l'apprentissage pourquoi Sudo cd
n'aboutit pas autrement, car si vous ne comprenez pas quoi Si vous êtes dans un nouveau shell (vous risquez de ne 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 devez exit
lorsque vous avez terminé. (Ce rappel sera probablement utile aux utilisateurs de n’importe quel niveau de compétence , car on n’est généralement pas habitué à se trouver dans un nouveau Shell lorsqu’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 ] && [ "$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 un moyen assez étrange d’utiliser Sudo
pour que vous ne souhaitiez l’activer que de temps en temps. 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 rendre la fonction Sudo
disponible afin qu'elle s'exécute au lieu de la commande Sudo
normale en exécutant . ~/Sudo.bash
. Cela prend effet dans le shell actuel et ses enfants, mais pas dans les autres. Pour la même raison que des fichiers tels que .bashrc
ne sont pas exécutables, ne cochez pas Sudo.bash
comme exécutable avec chmod
name__. Il s'agit en réalité d'une bibliothèque plutôt que d'un script Shell autonome. Si vous l'avez exécuté en tant que script shell, la fonction sera définie ... mais uniquement dans le shell qui a exécuté le script, pas pour vous en tant que l'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 savoir si Sudo
est actuellement défini 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 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 pour le faire, car cette fonction Sudo
le fait elle-même chaque fois qu'il y a plus ou moins de deux arguments transmis ou le premier argument qui lui est transmis est tout sauf cd
name__. C’est pourquoi vous pouvez toujours l’utiliser de la manière habituelle avec Sudo
name __.
Notez également que la fonction Shell présentée ci-dessus vous permet toujours de transmettre d'autres arguments à Sudo
name__, , mais cela l'empêchera de traiter cd
de manière spécifique . 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. Sudo -i cd directory
n'est pas non plus. Le shell qu'il crée est similaire à ce que vous obtenez avec Sudo -s
. Le code n'exécute pas réellement Sudo -s
, mais utilise Sudo bash
. L'option -c
fonctionne donc correctement. Il exécute en fait bash
deux fois lorsque vous lui transmettez cd
et un argument de répertoire (et zéro fois sinon). Lorsque vous exécutez Sudo cd directory
, il divise d’abord un shell bash distinct de celui sur lequel vous exécutez la fonction Sudo
et change le répertoire. Si cela réussit, il remplace ce bash Shell par un nouveau, interactif, que vous pouvez utiliser.
Voici un exemple de la manière dont cette fonction Shell "fait ce qui est bien". Notez que Sudo ls -A /root
se comporte normalement. Ce n'est que lorsque j'essaie ensuite de cd
dans un répertoire avec Sudo
qu'un nouveau shell est créé et que ce qui se passe est explicitement rappelé.
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 de Sudo cd
dans 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 invocations dans les exemples ci-dessus pour montrer qu'il vous authentifie en tant que root avant avant de tenter de changer de répertoire. Mais vous n'êtes pas obligé d'exécuter Sudo -k
vous-même. Parce que la fonction Shell n’est qu’une mince couche de protection pour la vraie commande Sudo
name__, la mise en cache de vos informations d’identité et des autres comportements communs Sudo
fonctionne toujours normalement.
Bien que cela fonctionne bien et qu’il soit plutôt ordonné, j’admets que l’observation de la vraie commande Sudo
avec une fonction du même nom est très bizarre. La plupart des utilisateurs voudront probablement simplement exécuter eux-mêmes les étapes Sudo -s
, cd directory
. Mais au cas où quelqu'un le voudrait - et aussi pour démontrer que c'était possible - le voilà.
En ce qui concerne le débat sur su
ou non, su
name__, je trouve cela idiot. su
s'oppose à la religion d'Ubuntu et ne doit pas être fait sans précaution. C'est incroyable ce qu'un rm -rf *
peut faire si vous êtes root. Toutefois, si vous êtes à l'aise avec l'interface de ligne de commande et que vous devez effectuer des tâches au niveau du système, il n'y a aucune raison de ne pas utiliser su
name__. J'ai utilisé plusieurs distributions où personne n'a même mentionné l'utilisation de Sudo
name__. Tout dépend du type de travail que vous faites et de la méthode avec laquelle vous êtes le plus à l'aise. J'utilise les deux.