Почему не работает `sudo cd / var / named`? [Дубликат]

У этого вопроса уже есть ответ здесь: Как ввести каталог с командой «cd», если он имеет разрешение 700 и не принадлежит мне? 7 ответов

Я хочу cd в /var/named, но он дает мне отказ в разрешении, и когда я хочу использовать sudo для этого, мне не разрешено. Какова техническая причина этого, и возможно ли это сделать другим способом?

1
задан 8 May 2013 в 14:22

4 ответа

Это потому, что cd не является исполняемым, это функция оболочки для изменения каталога.

Если вы запустите:

type cd

, вы получите:

cd - это функция оболочки

Вы можете использовать sudo -s, чтобы открыть интерактивную оболочку, а затем cd в нужную директорию:

sudo -s
cd /var/named

Чтобы вернуться назад для нормальной оболочки просто нажмите Ctrl + D.

24
ответ дан 24 May 2018 в 22:33

Также стоит помнить, что, несмотря на то, что статус cd является встроенной оболочкой или внешним двоичным файлом, sudo работает, создавая новый процесс для запуска указанной команды.

Почему это важно? Поскольку основной поток выполнения sudo становится чем-то очень похожим на это:

Оболочка запускает подпроцесс для запуска sudo с заданными параметрами sudo аутентифицирует пользователя и подтверждает их право на выполнение указанной команды sudo spawns off подпроцесс для выполнения указанной команды sudo ждет подпроцесса, порожденного на шаге 3, для выхода из sudo-выходов, возврата в оболочку. Подпроцесс, отложенный на шаге 1, завершается, возвращая пользователя в приглашение оболочки

(This может быть технически неверно, есть системный вызов, который фактически заменяет запущенный процесс новым (это библиотека C execve()). Однако для целей этого объяснения эти два эквивалентны.)

Это становится важным, если учесть, что текущий рабочий каталог является свойством каждого процесса и может . Поэтому, если процесс A запускает новый процесс B, процесс B начинается с того же рабочего каталога, в котором находился процесс A. (Вот почему что-то такое же обыденное, как ls ./ делает то, что вы ожидаете.) Но если процесс B изменяется его рабочий каталог, тогда, если процесс А не будет искать его, А совершенно не знает об этом изменении. (Это, в свою очередь, является причиной того, что если вы запускаете что-то вроде find / и прервите его на полпути, вы не попадете в какое-то, казалось бы, случайное место в файловой системе, просто потому, что находка, похоже, там была там он был прерван.)

Таким образом, даже если sudo cd /somewhere сделал именно то, что он говорит на жестяне, к тому времени, когда sudo выйдет, вы вернетесь туда, где вы начали. Следовательно, эффективно с точки зрения пользователя, он становится не-оператором. Тот факт, что cd, в то время как он выполнял, называл функцию библиотечной системы chdir() для установки нового рабочего каталога, не помогает вам, пользователю.

Как указал Уоррен Хилл sudo работает, создавая новый процесс для запуска указанной команды (я бы на самом деле не называл это обходным путем) заключается в использовании sudo -i, который бросает вас в корневую оболочку, где вы можете свободно перемещаться по файловой системе и выполнять любые команды, которые вы чувствуете. Однако обратите внимание, что когда вы выходите из этой оболочки, вы ее вернули назад, где вы начали в иерархии каталогов, по той же причине, что и я описал выше.

15
ответ дан 24 May 2018 в 22:33
  • 1
    Это объяснение было приятным, и ваш бит о «Так что, даже если sudo cd /somewhere сделал именно то, что он говорит на олове, к моменту выхода sudo вы вернетесь туда, где вы начали». был полезен. +1 – harperville 20 December 2016 в 19:14

Все приведенные выше ответы правильны; вот обходное решение, хотя

sudo sh -c "cd restricted-dir; some_command"
11
ответ дан 24 May 2018 в 22:33
  • 1
    Мне нравится это решение лучше всего, потому что вы делаете свои корневые файлы, а затем сразу возвращаетесь в режим без полномочий root, чтобы не забывать и делать Big Mistakes. – GlenPeterson 25 August 2016 в 22:50

Вы также можете временно изменить разрешение. chmod 0775 путь. Убедитесь, что вы вернули его, если необходимо.

3
ответ дан 24 May 2018 в 22:33
  • 1
    Добро пожаловать в Ask Ubuntu! Я рекомендую изменить этот ответ, чтобы развернуть его с подробными сведениями о том, как это сделать. (См. Также Как написать хороший ответ? для общих советов о том, какие ответы наиболее ценны для AskUbuntu.) – David Foerster 7 November 2016 в 22:03
  • 2
    Я не имею права запускать интерактивную оболочку с помощью sudo, так что это вполне подходящий способ. – Guillaume 19 September 2017 в 12:45

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

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