Occasionally I want to cd
into a directory where my user does not have permission, so I resort to sudo
.
The obvious command sudo cd somedir
doesn't work:
$ 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
Using sudo su
works:
$ sudo su
# cd test
Is it possible to make this into a one-liner? (Not a big deal, just idle curiosity :)
The variations I tried didn't work:
$ 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
The last one doesn't give an error, but it cd's within a new shell that exits by the end of the line, so it doesn't actually take me anywhere.
Can someone enlighten me as to why this happens? Why is sudo cd
not found, when for example sudo ls ...
works fine?
Theoretically, the problem is that if you don't have execute rights to a directory, you shouldn't be able to read the contents of the directory. Now suppose you could do what you wanted:
As you can see, you entered the directory using sudo privileges, then, when sudo returns, you become a user again, and you are in a directory where you normally shouldn't be.
Technically, the problem is the following.
cd
is a shell built-in, not a command.You are probably in /root, but it would have the same problem as with the next one.
You open a new root shell, cd into the directory, then exit the root shell, and return to where you began.
All in all, the only solution is to open a root shell and keep it open while you are in that directory.
i.e.
the key piece is "sh -c" which I use quite often to run a chain of commands in the same shell context/process.