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

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

177
задан 8 May 2013 в 13:22

5 ответов

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

1

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

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

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

sudo: cd: command not found

, поскольку cd не является программой.

2

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

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

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

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

sudo -i
cd /var/named 

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

0
ответ дан 8 May 2013 в 13:22

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

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

type cd

вы получите:

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

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

sudo -s
cd /var/named

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

0
ответ дан 8 May 2013 в 13:22

Все ответы выше верны; вот обходной путь, хотя

sudo sh -c "cd restricted-dir; some_command"
0
ответ дан 8 May 2013 в 13:22

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

sudo chmod 0775 path

или

sudo chmod + r folderpath

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

0
ответ дан 8 May 2013 в 13:22

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

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

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

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

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

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

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

18
ответ дан 8 May 2013 в 13:22

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

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