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


На этот вопрос уже есть ответ:

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


148
2018-05-06 19:02


происхождения




ответы:


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

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 -i
cd /var/named 

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


207
2018-05-06 19:30



Технически cd является встроенной и внешней командой. unix.stackexchange.com/questions/50058/... - kojiro
@kojiro Ubuntu не делает; по крайней мере, в чистой установке; иметь /usr/bin/cd только встроенный - Warren Hill
Что касается пункта 2: если вы sudo -i (или sudo su) тогда cd /var/named а потом su normaluser... можете ли вы это сделать? - Alvin Wong
@AlvinWong Почему бы не попробовать и не узнать? Просто протестируйте, если вы sudo -i тогда cd в каталог, который не должен находиться в su normal_user тогда pwd показывает, что вы находитесь в защищенном каталоге, но ls не работает ls: cannot open directory.: permission denied - Warren Hill
Обходной путь работал. - Nino Škopac


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

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

type cd

ваш получит:

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

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

sudo -s
cd /var/named

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


25
2018-05-06 19:29





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

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

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

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

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

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

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


16
2018-05-07 07:27



Это объяснение было приятным, и ваш бит о «Так что даже если sudo cd /somewhere сделал то, что он говорит на олове, к тому времени sudo выходы, вы возвращаетесь туда, где вы начали ». Было полезно. +1 - harperville


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

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

12
2017-11-07 06:00



Мне нравится это решение лучше всего, потому что вы делаете свои корневые файлы, а затем сразу возвращаетесь в режим без полномочий root, чтобы не забывать и делать Big Mistakes. - GlenPeterson


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


3
2017-11-07 17:14



Добро пожаловать в Ask Ubuntu! я рекомендую редактироватьчтобы ответить на этот вопрос, чтобы подробно рассказать о том, как это сделать. (Смотрите также Как написать хороший ответ? для общих советов о том, какие ответы наиболее ценны для AskUbuntu.) - David Foerster
Я не имею права запускать интерактивную оболочку с помощью sudo, так что это вполне подходящий способ. - Guillaume