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

53

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?

    
posée Bakhtiyor 19.08.2011 - 12:43
la source

7 réponses

76

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.

    
réponse donnée Rinzwind 19.08.2011 - 13:27
la source
31

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)

    
réponse donnée Vojtech Trefny 19.08.2011 - 12:57
la source
15

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

sudo su
# cd /root
    
réponse donnée Takkat 19.08.2011 - 12:55
la source
6

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"
    
réponse donnée Daniel Bauke 19.08.2011 - 20:52
la source
3

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
    
réponse donnée Vicky Dev 05.10.2016 - 07:15
la source
1

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:

  1. Exécutez 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.
  2. Exécutez cd directory dans le nouveau shell.
  3. Effectuez toutes les actions qui doivent être prises en tant que root dans le nouveau shell.
  4. Une fois terminé, exécutez 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.

%pre%

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:

%pre%

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

    
réponse donnée Eliah Kagan 11.12.2017 - 01:04
la source
0

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.

    
réponse donnée Joe 25.08.2011 - 07:34
la source

Lire d'autres questions sur les étiquettes