Якщо ви дійсно хочете зробити роботу, ви можете визначити функцію оболонки під назвою, яка запускає нову кореневу оболонку, коли вона запускається таким чином, і просто виконує звичайну команду в іншому випадку.sudo cd directory
bash
sudo
sudo
Як представлено в інших відповідях, більшість користувачів не захочуть робити це, а натомість хочуть:
- Запустіть
sudo -s
або sudo -i
якщо ви хочете оболонку входу (пам’ятайте, що одним із ефектів sudo -i
є запустити вас у домашній каталог root), або sudo bash
якщо ви хочете змусити bash
або мати можливість передавати параметри в оболонку.
- Виконати в новій оболонці.
cd directory
- Виконайте будь-які (інші) дії, які потрібно взяти за корінь у новій оболонці.
- Після закінчення запустіть,
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 shell з новою, інтерактивною, яку ви можете використовувати.
Ось приклад того, як функція оболонки автоматично "робить правильно". Зауважте, що 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
сам каталог.