Почему не работает "sudo cd /var/named"?

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

Причина, по которой вы не можете этого сделать, проста и двояка

1

cd это не программа, а встроенная команда и sudo применяется только к программам.

sudo foo означает запуск программы foo от имени root

sudo cd /path возвращается

sudo: cd: command not found

потому что cd это не программа.

2

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

Это невозможно.

Обходной путь:

Вы можете использовать sudo -i чтобы поднять себя до уровня суперпользователя. Например:

sudo -icd /var/named 

Теперь вы вошли в систему с правами root и можете использовать любые команды, которые пожелаете. Когда закончите, введите exit и вы снова войдете в систему как обычный пользователь.

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

Если ты побежишь:

type cd

ваша воля получит:

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

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

sudo -scd /var/named

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

Все приведенные выше ответы верны; однако вот обходной путь

sudo sh -c "cd restricted-dir; some_command"

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

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

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

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

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

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

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

Вы также можете временно изменить разрешение, если вы являетесь пользователем sudo.

путь sudo chmod 0775

или

sudo chmod +r путь к папке

Убедитесь, что вы положили его обратно, если это необходимо.