"sudo cd ..." однострочный? [дубликат]

Иногда мне нужно 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 ... работает нормально?

20
задан 2 January 2011 в 18:36

2 ответа

Теоретически, проблема в том, что если у вас нет прав на выполнение каталога, вы не сможете прочитать содержимое каталога. Теперь предположим, что вы можете делать то, что хотите:

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 в каталог, затем выходите из корневой оболочки и возвращаетесь к тому месту, с которого начали.

В общем, единственное решение - это открыть корневую оболочку и держать ее открытой, пока вы находитесь в этом каталоге.

20
ответ дан 2 January 2011 в 18:36
sudo sh -c "cd restricted-dir; some-other-command"

т.е.

sudo sh -c "cd /root/restricted-dir; ls -l"

ключевым элементом является "sh -c", который я довольно часто использую для выполнения цепочки команд в одном и том же контексте/процессе оболочки.

5
ответ дан 2 January 2011 в 18:36

Другие вопросы по тегам:

Похожие вопросы: