De temps en temps je veux cd
dans un répertoire où mon utilisateur n'a pas la permission, alors je recourt à Sudo
.
La commande évidente Sudo cd somedir
ne fonctionne pas:
$ Sudo mkdir test
$ Sudo chmod go-rxw test
$ ls -l
drwx------ 2 root root [...snip...] test
$ cd test
-bash: cd: test: Permission denied
$ Sudo cd test
Sudo: cd: command not found
Utiliser Sudo su
fonctionne:
$ Sudo su
# cd test
Est-il possible de faire cela dans un one-liner? (Pas un gros problème, juste une curiosité oisive :)
Les variations que j'ai essayées n'ont pas fonctionné:
$ Sudo "cd test"
Sudo: cd: command not found
$ Sudo -i cd test
-bash: line 0: cd: test: No such file or directory
$ Sudo -s cd test
Le dernier ne donne pas d'erreur, mais il se trouve dans un nouveau shell qui sort par le bout de la ligne, donc ça ne me mène nulle part.
Quelqu'un peut-il m'expliquer pourquoi cela se produit? Pourquoi Sudo cd
est-il introuvable, alors que par exemple Sudo ls ...
fonctionne correctement?
Théoriquement, le problème est que si vous ne possédez pas de droits d'exécution sur un répertoire, vous ne devriez pas pouvoir en lire le contenu. Supposons maintenant que vous puissiez faire ce que vous voulez:
user@desktop:/$ Sudo cd restricted-dir
user@desktop:/restricted-dir$ ls
file1 file2
Comme vous pouvez le constater, vous avez accédé au répertoire avec les privilèges Sudo. Lorsque vous revenez, vous redevenez un utilisateur et vous vous trouvez dans un répertoire où vous ne devriez normalement pas être.
Techniquement, le problème est le suivant.
Sudo cd restricted-dir
cd
est un shell intégré, pas une commande.
Sudo cd -i restricted-dir
Vous êtes probablement dans/root, mais cela poserait le même problème que pour le suivant.
Sudo cd -s restricted-dir
Vous ouvrez un nouveau shell racine, placez-vous dans le répertoire, puis quittez le shell racine et revenez à votre point de départ.
Dans l’ensemble, la seule solution consiste à ouvrir un shell racine et à le garder ouvert pendant que vous vous trouvez dans ce répertoire.
Sudo sh -c "cd restricted-dir; some-other-command"
c'est à dire.
Sudo sh -c "cd /root/restricted-dir; ls -l"
la pièce clé est "sh -c" que j'utilise assez souvent pour exécuter une chaîne de commandes dans le même contexte/processus Shell.