Ubuntu – “sudo cd …” one-liner?

command linesudo

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?

Best Answer

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:

user@desktop:/$ sudo cd restricted-dir
user@desktop:/restricted-dir$ ls
file1 file2

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.

sudo cd restricted-dir

cd is a shell built-in, not a command.

sudo cd -i restricted-dir

You are probably in /root, but it would have the same problem as with the next one.

sudo cd -s restricted-dir

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.

Related Question