Иногда мне нужно cd
в каталог, где у моего пользователя нет прав, поэтому я прибегаю к sudo
.
Очевидная команда sudo cd somedir
не работает:
$ 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
Использование sudo su
работает:
$ sudo su
# cd test
Можно ли сделать это однострочным? (Ничего страшного, просто праздное любопытство :)
Варианты, которые я пробовал, не сработали:
$ 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
Последний не выдает ошибки, но он записывается в новую оболочку, которая завершается к концу линия, так что на самом деле это меня никуда не ведет.
Может кто-нибудь объяснить мне, почему это происходит? Почему sudo cd
не найден, если, например, sudo ls ...
работает нормально?
Теоретически, проблема в том, что если у вас нет прав на выполнение каталога, вы не сможете прочитать содержимое каталога. Теперь предположим, что вы можете делать то, что хотите:
user@desktop:/$ sudo cd restricted-dir
user@desktop:/restricted-dir$ ls
file1 file2
Как видите, вы вошли в каталог, используя права sudo, затем, когда sudo вернется, вы снова становитесь пользователем, и вы находитесь в каталоге, где обычно не должны быть.
Технически, проблема заключается в следующем.
sudo cd restricted-dir
cd
- это встроенный оболочка, а не команда.
sudo cd -i restricted-dir
Вы, вероятно, находитесь в /root, но у него будет та же проблема, что и со следующим каталогом.
sudo cd -s restricted-dir
Вы открываете новую корневую оболочку, cd в каталог, затем выходите из корневой оболочки и возвращаетесь к тому месту, с которого начали.
В общем, единственное решение - это открыть корневую оболочку и держать ее открытой, пока вы находитесь в этом каталоге.
sudo sh -c "cd restricted-dir; some-other-command"
т.е.
sudo sh -c "cd /root/restricted-dir; ls -l"
ключевым элементом является "sh -c", который я довольно часто использую для выполнения цепочки команд в одном и том же контексте/процессе оболочки.