Если вы действительно хотите заставить работать, вы можете определить функцию оболочки с именем, которая будет запускать новую корневую оболочку при этом, и просто выполнять обычную команду в противном случае.sudo cd directory
bash
sudo
sudo
Как представлено в других ответах, большинство пользователей не захотят это делать, а вместо этого захотят:
- Запустите
sudo -s
, или sudo -i
если вы хотите войти в оболочку (помните, что одним из эффектов sudo -i
является запуск вас в домашнем каталоге root), или sudo bash
если вы хотите принудительно bash
или иметь возможность передавать параметры в оболочку.
- Запустите в новой оболочке.
cd directory
- Выполните любые (другие) действия, которые должны быть приняты как root в новой оболочке.
- После этого бегите,
exit
чтобы покинуть новую оболочку. Важно не забывать об этом, потому что вы не хотите выполнять от имени root больше действий, чем вы предполагали!
Итак, если вы хотите, то вы можете написать функцию оболочки (или сценарий), которая выполняет первые два из этих действий, когда 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
специально . Запуск , в частности , не поддерживается, хотя вы могли бы расширить функции оболочки , чтобы поддержать этот случай. И нет . Оболочка, которую он создает, похожа на ту, что вы получаете . Код на самом деле не запускается , а использует , поэтому опция работает правильно. На самом деле он запускается дважды, когда вы передаете ему аргумент каталога (и ноль раз в противном случае). Когда вы запускаете , сначала он отделяет отдельную оболочку bash от той, в которой вы запускаете функцию, и меняет каталог. Если это удается, он заменяетsudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
эта оболочка bash с новой интерактивной оболочкой, которую вы можете использовать.
Вот пример того, как эта функция оболочки автоматически «делает правильные вещи». Обратите внимание, что 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
в каталог, который вы не можете изменить даже в качестве пользователя root, то вы просто получите сообщение об ошибке:
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
между вызовами в приведенных выше примерах, чтобы показать, что он аутентифицирует вас как root перед попыткой изменить каталог. Но на самом деле вам не нужно бежать sudo -k
самостоятельно. Поскольку функция оболочки является лишь тонкой оболочкой для настоящей sudo
команды , кэширование ваших учетных данных и другие распространенные sudo
действия по-прежнему работают нормально.
Хотя это работает хорошо и довольно аккуратно, я признаю, что дублирование реальной sudo
команды с помощью функции с тем же именем супер странно. Большинство пользователей, вероятно , просто хочу , чтобы выполнить шаги sudo -s
, сами. Но на случай, если кто-то захочет этого - а также продемонстрирует, что это возможно, - так оно и есть.cd directory
ls -l
самого каталога.