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


87

J'ai essayé d'utiliser sudo cd name_of_dirmais 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?


2
veuillez ajouter un ls -ldes répertoires lui-même.
Rinzwind

7
Et s'il vous plaît expliquer pourquoi vous continuez à laisser des commentaires négatifs contre les réponses valides ici. Si vous pensez qu'il existe (ou devrait être) une meilleure solution, veuillez nous en informer.
Oli

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirSemble être la seule réponse que vous serez heureux avec.
Marco Ceppi

3
Les réponses données ici sont correctes, mais vous les rejetez et dites qu'elles ont tort. Ne rejetez pas simplement ce qui est dit à cause de quelque chose d'autre que vous avez vu.
Richard Holloway

3
C'est marrant ... il veut sudo cdtravailler, mais il rejette les solutions en utilisant sudo ou su. Il dit qu'il ne veut pas travailler en tant que root, mais il souhaite tout de même accéder directement à un site qu'il ne possède pas. Cela ressemble à un troll pour moi ...
MestreLion

Réponses:


111

sudo cdne fonctionnera pas car la cdcommande 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 sudo est recherchée, mais il n'y a pas de cdcommande à trouver.

La méthode à utiliser consiste à basculer vers l'utilisateur qui possède le répertoire. L'autorisation 700signifie que "le propriétaire peut lire, écrire et exécuter".

Donc, si root possède le répertoire sudo -i, password et alors 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 changer pour cet utilisateur avec su {username}, puis l'utiliser cdcomme utilisateur.


Question secondaire: root pourra-t-il entrer un 700 dir même s’il n’est pas le propriétaire?
MestreLion

3
oui MestreLion, 700 n'empêcheront pas root de se divertir. Les autorisations '000' empêcheront l'utilisateur d'entrer lui-même (oui, un utilisateur peut créer un répertoire qu'il ne peut pas entrer lui-même ...), mais l'utilisateur root peut toujours le saisir.
Rinzwind

1
echo est une commande du shell, pourquoi je peux lancer "sudo echo" mais pas "sudo cd"?
Shoujs

Désolé, les mêmes règles s'appliquent à sudo echo: vous avez besoin de quelque chose comme echo 'deb {text}' | sudo tee --append {file}utiliser echo avec sudo et modifier un fichier.
Rinzwind

1
Pourquoi ne fait-il pas partie cddes commandes disponibles sudo?
Aaron Franke

44

sudo -i

pour ouvrir "console root" puis

cd /path/to/directory

( cdest une commande intégrée au shell, donc ce ne peut pas être la cible sudo)


19

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

sudo su
# cd /root

3
Je ne voudrais pas travailler en tant que racine. JAMAIS!!! Et aussi les experts recommandent de ne jamais se connecter en tant que root. -1
Bakhtiyor

8
Eh bien, c’est exactement la raison pour laquelle vous ne voulez pas que les autorisations ouvrent les répertoires root, n’est-ce pas?
Takkat

10
Il n'y a rien de mal à aller en mode racine. Les experts recommanderont toujours d’aller dans root quand il est nécessaire.
Rinzwind

2
Si vous travaillez avec des éléments appartenant à root, parfois sudo suing (ou une autre méthode) est la seule méthode pratique, voire possible. Les "experts" vous disent seulement de ne pas utiliser la racine comme habitude - c'est bien quand vous en avez réellement besoin. Et @Vojtech, rien n’est impossible ...
Oli

2
@Bakhtiyor: travailler tout le temps en tant que root n'est en effet pas recommandé. Mais l’émettre pour une (ou quelques) commandes est acceptable. Particulièrement si vous essayez d'entrer dans un répertoire pour lequel votre utilisateur n'a pas l'autorisation . Vous devez donc être le propriétaire ou la racine.
MestreLion

10

Comme d'autres l'ont fait remarquer, son 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"

5
+1 pour l'idée sudo bash -c ... et une suggestion: évitez d'utiliser which. C'est simplement un script, et il ne gérera pas toutes les possibilités (binaire, construit, alias, etc.). Utilisez à la typeplace. Bien plus sûr, puissant et portable. Et type -ppour le chemin d'un exécutable.
MestreLion

1
Cela dépend ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(homme zshbuiltins)
Daniel Bauke

1
Cela ne dépend pas . whenceest zsh-only ... cela ne fonctionne pas dans bash, il n'est même pas installé par défaut dans Ubuntu. While typeest POSIX , ce qui signifie que cela fonctionnera dans n’importe quel shell moderne ... bash, csh, ksh .. et même zsh.
MestreLion

Bien sûr, c’est la raison pour laquelle j’ai voté contre votre commentaire au moment même où il est apparu, mais j’ai déclaré que, dans zsh, ce n’est pas un script et donne des résultats similaires, typecar ils sont tous deux des alias de la même commande.
Daniel Bauke

Ah je comprends maintenant. Bien, mais c'est dans zsh. Dans bash, qui est le terminal terminal par défaut (et généralement le seul) dans Ubuntu, whichn’est pas intégré ... so type(ou type -p) est préférable.
MestreLion

4

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/

Puis, 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 par &&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

2

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:

  1. 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.
  2. Exécuter dans le nouveau shell.cd directory
  3. Effectuez toutes les actions (autres) qui doivent être prises en tant que racine dans le nouveau shell.
  4. 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


0

En ce qui concerne le fait de sune pas sudébattre, je pense que c'est idiot. suest contre la religion d'Ubuntu et ce n'est pas quelque chose à faire négligemment. C'est incroyable ce que l' rm -rf *on 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 l'utiliser su. J'ai utilisé plusieurs distributions dont personne n'a même parlé sudo. 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.


1
"Dans les versions de bash et sudomoi avons avec kubuntu lucid, sudo cdfonctionne maintenant - sans aucune solution de contournement." À part quelque chose comme ça , qui, je suis sûr, n’a jamais été dans Ubuntu par défaut, je ne vois pas comment. (En outre, j'ai utilisé 10.04; il ne l'a pas fait.) Cela fait des années que vous avez posté ceci, mais vous souvenez-vous des détails? Ça sudo cdmarche toujours pour toi? Quelle est la sortie de type -a sudodans un shell où cela fonctionne? Je comprends que vous ne le sachiez peut-être pas - et la deuxième partie de votre réponse reste pertinente - mais si vous le faites, vous pouvez le modifier .
Eliah Kagan

@EliahKagan Cela ne fonctionne vraiment pas pour moi maintenant en 16h10 et je ne me souviens pas de ce que j'ai fait à l'époque. C'est contre ma religion de modifier les commandes de base existantes, il est donc peu probable que je l'aie fait. Dans tous les cas, même si cela fonctionnait, tout le monde dirait que c'est une mauvaise habitude, car cela ne fonctionnerait pas en général.
Joe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.