web-dev-qa-db-fra.com

Comment entrer dans un répertoire avec la commande 'cd' s'il a la permission 700 et qu'il ne m'appartient pas?

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?

81
Bakhtiyor

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.

104
Rinzwind

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)

40
Vojtech Trefny

Pour ouvrir un répertoire racine, nous pouvons exécuter un shell racine, par exemple:

Sudo su
# cd /root
17
Takkat

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"
10
Daniel Bauke

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
4
Vicky Dev

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 Sudoname__.

Comme présenté dans d'autres réponses, la plupart des utilisateurs ne voudront pas vouloir le faire, mais voudront plutôt:

  1. Exécutez 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 bashou pouvoir transmettre des options au shell.
  2. Exécutez cd directory dans le nouveau shell.
  3. Effectuez toutes les actions (autres) qui doivent être prises en tant que racine dans le nouveau shell.
  4. Une fois cela fait, exécutez exitpour 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 Sudoest suivi de cdet exécute simplement Sudonormalement. 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 exitlorsque 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 Sudosans -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 Sudopour 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 Sudodisponible afin qu'elle s'exécute au lieu de la commande Sudonormale 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 chmodname__. 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 Sudoest 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 Sudoré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 Sudole 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 cdname__. C’est pourquoi vous pouvez toujours l’utiliser de la manière habituelle avec Sudoname __.

Notez également que la fonction Shell présentée ci-dessus vous permet toujours de transmettre d'autres arguments à Sudoname__, , mais cela l'empêchera de traiter cdde 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 bashdeux fois lorsque vous lui transmettez cdet 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 Sudoet 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 cddans un répertoire avec Sudoqu'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 Sudoname__, la mise en cache de vos informations d’identité et des autres comportements communs Sudofonctionne toujours normalement.

Bien que cela fonctionne bien et qu’il soit plutôt ordonné, j’admets que l’observation de la vraie commande Sudoavec 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à.

2
Eliah Kagan

En ce qui concerne le débat sur suou non, suname__, je trouve cela idiot. sus'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 suname__. J'ai utilisé plusieurs distributions où personne n'a même mentionné l'utilisation de Sudoname__. 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.

0
Joe