На этот вопрос уже есть ответ здесь:
Я хочу cd
в / var / named
, но это дает мне ошибку «отказано в разрешении», и когда я хочу использовать sudo
делать это мне не разрешено. Какова техническая причина этого, и можно ли сделать это другим способом?
Причина, по которой вы не можете сделать это, проста: два раза
cd
- это не программа, а встроенная команда, и sudo
относится только к программам. .
sudo foo
означает запуск программы foo от имени root
sudo cd /path
возвращает
sudo: cd: command not found
, поскольку cd
не является программой.
Если бы можно было использовать sudo - cd
для защищенного каталога, то, запустив команду sudo cd /var/named
, вы бы были в этом каталоге как обычный пользователь, но обычные пользователи не могут находиться в этом каталоге.
Это невозможно.
Обходной путь:
Вы можете использовать sudo -i
, чтобы поднять себя до суперпользователя. Например:
sudo -i
cd /var/named
Теперь вы вошли в систему как пользователь root и можете использовать любые команды, какие пожелаете. Когда закончите, напечатайте exit
и вы вернетесь в систему как обычный пользователь.
Это потому, что cd
не является исполняемым файлом, это функция оболочки для смены каталога.
Если вы запустите:
type cd
вы получите:
CD - это функция оболочки
blockquote>Вы можете использовать
sudo -s
чтобы открыть интерактивную оболочку и затемcd
перейти в нужный каталог:sudo -s cd /var/named
Чтобы вернуться к обычной оболочке, просто нажмите Ctrl kbd> + D kbd >.
Все ответы выше верны; вот обходной путь, хотя
sudo sh -c "cd restricted-dir; some_command"
Вы также можете временно изменить разрешение, если вы являетесь пользователем sudo.
sudo chmod 0775 path
или
sudo chmod + r folderpath
Убедитесь, что вы вернули его обратно, если это необходимо.
Также стоит помнить это, cd
состояние как оболочка встроенный или внешний двоичный файл, несмотря на это, sudo работает путем порождения нового процесса для выполнения указанной команды.
Почему это важно? Поскольку основной поток выполнения sudo становится чем-то очень похожим на это:
(Это может быть технически немного неправильно; существует системный вызов, который на самом деле заменяет рабочий процесс новым (это - библиотека C execve()
). Однако в целях этого объяснения, эти два эквивалентны.)
Это становится важным, когда Вы полагаете, что текущий рабочий каталог является свойством каждого процесса и наследован, но не продвинут. Таким образом, если процесс икра от нового процесса B, то обработайте B, запускается с того же рабочего каталога, в котором был A процесса. (Это то, почему что-то столь же приземленное как ls ./
делает то, что Вы ожидали бы.), Но если процесс B изменяет свой рабочий каталог, то, если процесс A не выходит из его способа искать это, A полностью не знает о том изменении. (Это, в свою очередь, то, почему при выполнении чего-то как find /
и прервите его на полпути через, Вы не оказываетесь в некотором на вид случайном местоположении в файловой системе просто, потому что находят, оказалось, смотрел там в данный момент, это было прервано.)
Итак, даже если sudo cd /somewhere
сделал точно, что это говорит относительно олова к этому времени sudo
выходы, Вы приведены назад, где Вы запустили. Следовательно эффективно с точки зрения пользователя, это становится нет. Факт это cd
, в то время как это выполнялось, названный chdir()
функция системной библиотеки для установки нового рабочего каталога, не помогает Вам, пользователю.
Как Warren Hill указал, надлежащее решение (я на самом деле не буду звонить, это обходное решение) должен использовать sudo -i
который отбрасывает Вас к корневой оболочке, где можно перейти вокруг файловой системы свободно и выполнить любые команды, Вы чувствуете себя подобно. Действительно обратите внимание однако, что при выходе из этой оболочки Вы все еще приведены назад, где Вы запустили в иерархии каталогов по точно той же причине, как я описал выше.