Jeśli naprawdę chcesz działać, możesz zdefiniować funkcję powłoki o nazwie, która uruchamia nową powłokę główną podczas uruchamiania w ten sposób, i po prostu uruchamia zwykłe polecenie w przeciwnym razie.sudo cd directory
bash
sudo
sudo
Jak przedstawiono w innych odpowiedziach, większość użytkowników nie będzie chciała tego robić, ale zamiast tego będzie chciała:
- Uruchom
sudo -s
lub sudo -i
jeśli chcesz powłoki logowania (pamiętaj, że jednym z efektów sudo -i
jest uruchomienie Cię w katalogu głównym root) lub sudo bash
jeśli chcesz wymusić bash
lub móc przekazać opcje do powłoki.
- Uruchom w nowej powłoce.
cd directory
- Wykonaj dowolne (inne) działania, które należy podjąć jako root w nowej powłoce.
- Po zakończeniu biegnij,
exit
aby opuścić nową powłokę. Ważne jest, aby nie zapominać o tym, ponieważ nie chcesz wykonywać większej liczby akcji jako root niż planujesz!
Tak więc, jeśli chcesz, możesz napisać funkcję powłoki (lub skrypt), która wykonuje dwie pierwsze z tych akcji, sudo
a następnie normalnie cd
działa sudo
inaczej. Nie używaj tego jako alternatywy dla dowiedzenia się, dlaczego sudo cd
inaczej się nie powiedzie , ponieważ jeśli nie rozumiesz, co się dzieje, prawdopodobnie będziesz bardzo zdezorientowany, będąc w nowej powłoce (i możesz nie zrozumieć żadnych komunikatów o błędach które występują).
Oto jeden ze sposobów na napisanie takiej funkcji powłoki, która również przypomina, że jesteś w nowej powłoce i że powinieneś exit
z niej wyjść po zakończeniu. (Przypominamy, że prawdopodobnie będzie przydatna dla użytkowników dowolnym poziomie umiejętności, bo nie jest na ogół przyzwyczajeni do bycia w nowej powłoce, gdy jeden pracuje sudo
bez -s
, -i
lub nazwa rzeczywistej muszli jako argument).
# 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
}
Możesz umieścić to w swoim ~/.bashrc
, choć jest to na tyle dziwny sposób, sudo
że możesz chcieć to włączać tylko od czasu do czasu. W takim przypadku lepiej jest umieścić go we własnym pliku. Jeśli utworzysz plik o nazwie sudo.bash
w katalogu domowym z tą zawartością, możesz udostępnić sudo
funkcję - aby działała zamiast zwykłego sudo
polecenia - uruchamiając . ~/sudo.bash
. Działa to w bieżącej powłoce i jej podrzędnych powłokach, ale nie w innych. Z tego samego powodu, że pliki jak .bashrc
nie są wykonywalne, nie oznaczają sudo.bash
wykonywalny chmod
. To naprawdę biblioteka, a nie samodzielny skrypt powłoki. Jeśli takuruchom go jako skrypt powłoki, zdefiniuje funkcję ... ale tylko w powłoce, która uruchomiła skrypt, a nie dla ciebie jako wywołującego. (Oczywiście, można napisać skrypt, za to, że po prostu nie zdarza się być podejście Wziąłem tutaj).
Aby sprawdzić, czy sudo
jest obecnie zdefiniowana jako funkcja powłoki, i zobaczyć jej bieżącą definicję, jeśli jest to jedna, uruchom type sudo
. Aby wyłączyć (tzn. Cofnąć definicję) funkcję po jej zdefiniowaniu, uruchom unset -f sudo
. Aby ręcznie uruchomić zwykłe sudo
polecenie bezpośrednio, nawet jeśli funkcja powłoki jest zdefiniowana, uruchom command sudo
. Zauważ jednak, że nie musisz tego robić, ponieważ ta sudo
funkcja faktycznie robi to sama, ilekroć przesłano do niej więcej lub mniej niż dwa argumenty lub pierwszy przekazany argument jest inny cd
. Dlatego nadal możesz go używać w zwykły sposób, z którego korzystają ludzie sudo
.
Zauważ również, że funkcja powłoki pokazana powyżej nadal pozwala ci przekazywać inne argumenty sudo
, ale uniemożliwi to jej cd
specjalne traktowanie . Uruchomiony w szczególności nie jest obsługiwany, choć można rozszerzyć funkcję powłoki na poparcie tej sprawy. Ani nie jest . Powłoka, którą tworzy, jest podobna do tego, co dostajesz . Kod tak naprawdę nie działa , ale używa , więc opcja działa poprawnie. W rzeczywistości działa dwa razy, gdy przekazujesz i argument katalogu (w przeciwnym razie zero razy). Po uruchomieniu najpierw uruchamia oddzielną powłokę bash od tej, w której uruchamiasz funkcję, i zmienia katalog. Jeśli to się powiedzie, zastępujesudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
tę powłokę bashową z nową, interaktywną, której możesz użyć.
Oto przykład, w jaki sposób ta funkcja powłoki automatycznie „robi właściwą rzecz”. Zauważ, że sudo ls -A /root
zachowuje się normalnie. Dopiero wtedy, gdy próbuję wejść cd
do katalogu sudo
, tworzona jest nowa powłoka i wyraźnie przypomina mi się, co się dzieje.
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:~$
Jeśli spróbujesz przejść sudo cd
do katalogu, do którego nie możesz zmienić nawet jako root, pojawi się komunikat o błędzie:
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:~$
Użyłem sudo -k
pomiędzy wywołaniami w powyższych przykładach, aby pokazać, że uwierzytelnia cię jako root przed próbą zmiany katalogu. Ale tak naprawdę nie musisz sudo -k
sam biegać . Ponieważ funkcja powłoki jest tylko cienkim opakowaniem dla prawdziwego sudo
polecenia , buforowanie poświadczeń i inne typowe sudo
zachowania nadal działają normalnie.
Chociaż działa dobrze i jest całkiem fajny, przyznaję, że cieniowanie prawdziwego sudo
polecenia funkcją o tej samej nazwie jest super dziwne. Większość użytkowników prawdopodobnie po prostu chcą wykonać czynności sudo -s
, sami. Ale na wypadek, gdyby ktoś tego chciał - a także wykazał, że jest to możliwe - jest.cd directory
ls -l
sam katalog.