Я пытался использовать sudo cd name_of_dir
но получаю сообщение об ошибке:
sudo: cd: command not found
Там какой-либо другой путь состоит в том, чтобы ввести каталог, принадлежавший другому пользователю, который имеет 700 разрешений?
sudo cd
не будет работать потому что cd
команда встроена в оболочку. Таким образом, как Вы говорите, становятся корнем и затем выполняют эту команду. Вы становитесь корнем, и затем команда после sudo разыскивается, но существует нет cd
управляйте для нахождения.
Метод для использования должен переключиться на пользователя, который владеет каталогом. Разрешение 700
предназначен, поскольку "владелец может читать, запишите и выполнитесь".
Таким образом, если корень владеет каталогом sudo -i
, пароль и затем cd {dir}
единственный корректный метод. Если кто-то еще владеет каталогом, Вы можете все еще использовать 1-й метод, но можете также измениться на того пользователя с su {username}
и затем используйте cd
как тот пользователь.
sudo -i
открыть "root console" и затем
cd /path/to/directory
(cd
оболочка встроенная команда, таким образом, это не может быть цель sudo),
Для открытия корневого каталога, мы можем выполнить корневую оболочку, например:
sudo su
# cd /root
Как другие указали - это - встроенная оболочка:
~ % which cd
cd: shell built-in command
Так, почему не делают Вас sudo сама оболочка?
~ % sudo $SHELL -c "cd name_of_dir"
Можно также повысить себя до пользователя root:
sudo -s
Затем Вы можете CD к любому каталогу, который не позволяет обычному пользователю войти как:
cd /root
Или
cd /var/lib/
Затем после того, как Вы сделаны там тип:
exit
К выходу из системы полномочий пользователя root.
Для подъема себя как корень можно также объединить две команды &&
оператор как ниже, этот оператор также поддерживает их последовательность выполнения, если текущая команда выполняется успешно, и только затем следующей команде позволяют выполниться:
sudo -s && cd /var/lib
Или
sudo -s && cd /root
Если Вы действительно хотите сделать sudo cd directory
работа, можно определить a bash
окружите вызванную функцию sudo
это выполняет новую корневую оболочку, когда выполнено тот путь и просто выполняет постоянного клиента sudo
команда иначе.
Как представлено в других ответах, большинство пользователей не захочет потрудиться делать это, но вместо этого захочет:
sudo -s
, или sudo -i
если Вы хотите оболочку входа в систему (помните что один эффект sudo -i
должен начать Вас в корневом каталоге корня), или sudo bash
если Вы хотите вызвать bash
или смочь передать опции оболочке.cd directory
в новой оболочке.exit
оставить новую оболочку. Важно не забыть это, потому что Вы не хотите выполнять больше действий как корень, чем Вы предназначаете!Так, если Вы хотите, затем можно записать функцию оболочки (или сценарий), который выполняет первые два из тех действий когда sudo
сопровождается cd
, и просто выполнения sudo
обычно иначе. Не используйте это в качестве альтернативы изучению почему sudo cd
иначе не успешно выполняется, потому что, если Вы не понимаете то, что продолжается, затем Вы, вероятно, будете очень смущены путем нахождения в новой оболочке (и Вы не можете понять сообщения об ошибках, которые происходят).
Вот один способ записать такую функцию оболочки, которая также напоминает Вам, что Вы находитесь в новой оболочке и что Вы должны exit
из него, когда Вы закончены. (Что напоминание, вероятно, будет полезно для пользователей любого уровня квалификации, потому что каждый обычно не приучается к тому, чтобы быть в новой оболочке, когда каждый работает sudo
без -s
, -i
, или название фактической оболочки как аргумент.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
Вы могли вставить это Ваш ~/.bashrc
, хотя это - достаточно странный способ использовать sudo
то, что можно только хотеть включить его иногда. В этом случае лучше поместить его в свой собственный файл. Если Вы создаете названный файл sudo.bash
в Вашем корневом каталоге с тем содержанием затем можно сделать sudo
доступная функция - так, чтобы это работало вместо постоянного клиента sudo
команда - путем выполнения . ~/sudo.bash
. Это вступает в силу в текущей оболочке и ее дочерних оболочках, но не других. По той же причине это регистрирует как .bashrc
не исполняемый файл, не отмечать sudo.bash
исполняемый файл с chmod
. Это - действительно библиотека, а не автономный сценарий оболочки. При выполнении его как сценария оболочки это определило бы функцию..., но только в оболочке, которая запустила скрипт, не для Вас как вызывающая сторона. (Конечно, можно записать сценарий для этого, которое просто, оказывается, не подход, который я проявил здесь.)
Проверять и видеть если sudo
в настоящее время определяется как функция оболочки, и видеть ее текущее определение, если это один, выполнено type sudo
. Чтобы отключить (т.е. не определить), функция, после того как это определяется, работает unset -f sudo
. Вручную выполнять постоянного клиента sudo
управляйте непосредственно, даже если функция оболочки определяется, работать command sudo
. Обратите внимание, однако, что Вы не должны делать этого, потому что это sudo
функция на самом деле делает это само каждый раз, когда существует больше, или меньше чем два аргумента передали ей, или первый аргумент передал ей, совсем не cd
. Вот почему можно все еще использовать его нормальными способами, которыми используют люди sudo
.
Обратите внимание также, что функция оболочки, показанная выше, действительно все еще позволяет Вам передать другие аргументы sudo
, но это будет препятствовать тому, чтобы он рассматривал cd
особенно. Выполнение sudo -u user cd directory
в особенности не поддерживается, хотя Вы могли расширить функцию оболочки для поддержки того случая. Ни sudo -i cd directory
. Оболочка, которую это создает, подобна тому, с чем Вы добираетесь sudo -s
. Код на самом деле не работает sudo -s
, но использование sudo bash
, так -c
опция работает правильно. Это на самом деле работает bash
дважды, когда Вы передаете cd
и аргумент каталога ему (и нулевые времена иначе). Когда Вы работаете sudo cd directory
, сначала это разветвляется от отдельной оболочки удара от той, которую Вы выполняете sudo
функция в и каталог изменений. Если это успешно выполняется, это заменяет ту оболочку удара новой, интерактивной, которую можно использовать.
Вот пример того, как та функция оболочки автоматически "делает правильную вещь". Заметьте это sudo ls -A /root
обычно ведет себя. Только, когда я затем пытаюсь cd
к каталогу с sudo
новая оболочка, созданная, и мне напоминают явно того, что продолжается.
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
При попытке sudo cd
к каталогу, который Вы не можете изменить на то, как раз когда корень, затем Вы просто получите сообщение об ошибке:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
Я использовал sudo -k
промежуточные вызовы в вышеупомянутых примерах, чтобы показать, что это аутентифицирует Вас как корень прежде, чем попытаться изменить каталог. Но Вы не должны на самом деле работать sudo -k
самостоятельно. Поскольку функция оболочки является просто тонкой оберткой для реального sudo
команда, кэширование Ваших учетных данных и другого общего sudo
поведения все еще обычно работают.
Хотя это работает хорошо и довольно аккуратно, я допускаю то затенение реальное sudo
команда с функцией того же имени является супер странной. Большинство пользователей, вероятно, просто захочет выполнить шаги sudo -s
, cd directory
самостоятельно. Но в случае, если кто-либо хочет это - и также продемонстрировать, что это возможно - там это.
Что касается су
или нет су
дебаты, Я думаю, что это глупо. Су
против религии Убунту, и это не то, что нужно делать небрежно. Удивительно, что rm -rf *
может сделать, если вы root. Но, если вы знакомы с интерфейсом командной строки (CLI) и имеете задачи на системном уровне, нет никаких причин не использовать su
. Я использовал несколько дистрибутивов, где никто даже не упомянул использование sudo
. Вопрос только в том, какую работу вы делаете и какой метод вам наиболее удобен. Я использую оба.
@Daniel Bauke, решение работает, когда вы пытаетесь sudo
выполнить составную команду, такую как cd /some/path && ./executableScript.sh
, что может быть вам нужно, если executableScript.sh
нужно выполнить из своего каталога, и он требует sudo
как для входа в каталог, так и для запуска скрипта (и вы хотите сделать это в неинтерактивный/сессионный способ.
Повторюсь, решение Даниэля Бауке:
sudo $SHELL -c "cd /some/path && ./executableScript.sh"