Якщо ви дійсно хочете зробити роботу, ви можете визначити функцію оболонки під назвою, яка запускає нову кореневу оболонку, коли вона запускається таким чином, і просто виконує звичайну команду в іншому випадку.sudo cd directorybashsudosudo
Як представлено в інших відповідях, більшість користувачів не захочуть робити це, а натомість хочуть:
- Запустіть
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 directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo що 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сам каталог.