Wenn Sie wirklich arbeiten möchten , können Sie eine Shell-Funktion definieren , die eine neue Root-Shell ausführt, wenn Sie auf diese Weise ausgeführt wird . Andernfalls wird nur der reguläre Befehl ausgeführt.sudo cd directory
bash
sudo
sudo
Wie in anderen Antworten dargestellt, möchten die meisten Benutzer dies nicht tun, sondern stattdessen:
- Führen Sie das Programm aus
sudo -s
, oder sudo -i
wenn Sie eine Anmeldeshell verwenden möchten (denken Sie daran, dass ein Effekt darin sudo -i
besteht, Sie im Stammverzeichnis des Stammverzeichnisses zu starten), oder sudo bash
wenn Sie bash
Optionen erzwingen oder an die Shell übergeben möchten .
- Führen Sie die neue Shell aus.
cd directory
- Führen Sie alle (anderen) Aktionen aus, die als Root in der neuen Shell verwendet werden müssen.
- Führen Sie
exit
den Befehl aus, um die neue Shell zu verlassen. Es ist wichtig, dies nicht zu vergessen, da Sie nicht mehr Aktionen als root ausführen möchten, als Sie beabsichtigen!
Wenn Sie möchten, können Sie eine Shell-Funktion (oder ein Skript) schreiben, die die ersten beiden dieser Aktionen ausführt, wenn sie sudo
gefolgt werden cd
, und sudo
ansonsten normal ausgeführt wird. Verwenden Sie dies nicht als Alternative zum Lernen, warum sudo cd
dies sonst nicht gelingt . Wenn Sie nicht verstehen, was gerade passiert , werden Sie wahrscheinlich sehr verwirrt sein , wenn Sie sich in einer neuen Shell befinden (und möglicherweise verstehen Sie keine Fehlermeldungen) die auftreten).
Hier ist eine Möglichkeit, eine solche Shell-Funktion zu schreiben, die Sie auch daran erinnert, dass Sie sich in einer neuen Shell befinden und dass Sie diese beenden sollten exit
, wenn Sie fertig sind. (Das Erinnerung ist wahrscheinlich für die Nutzer nützlich sein jedem Skill - Level, da man im Allgemeinen nicht gewohnt ist , in eine neue Schale zu sein , wenn man läuft sudo
ohne -s
, -i
oder den Namen eines tatsächlichen Shell als 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
}
Sie können dies in Ihre einfügen ~/.bashrc
, obwohl dies eine merkwürdige Methode ist, sudo
die Sie möglicherweise nur gelegentlich aktivieren möchten. In diesem Fall ist es besser, es in einer eigenen Datei abzulegen. Wenn Sie eine Datei erstellen, die sudo.bash
in Ihrem Ausgangsverzeichnis mit diesen Inhalten aufgerufen wird , können Sie die sudo
Funktion verfügbar machen, sodass sie anstelle des regulären sudo
Befehls ausgeführt wird . ~/sudo.bash
. Dies wirkt sich auf die aktuelle Shell und ihre untergeordneten Shells aus, jedoch nicht auf andere. Aus dem gleichen Grund, aus dem Dateien wie .bashrc
nicht ausführbar sind, markieren Sie sudo.bash
ausführbar nicht mit chmod
. Dies ist wirklich eine Bibliothek und kein eigenständiges Shell-Skript. Wenn du es getan hastFühre es als Shell-Skript aus, es würde die Funktion definieren ... aber nur in der Shell, in der das Skript ausgeführt wurde, nicht für dich als Aufrufer. (Natürlich können Sie können ein Skript für diesen schreiben, die einfach nicht sein geschehen der Ansatz , den ich hier getroffen habe.)
sudo
Führen Sie Folgendes aus, um zu überprüfen, ob eine Shell-Funktion definiert ist, und um zu überprüfen, ob eine Shell-Funktion definiert ist type sudo
. Führen Sie die folgende Anweisung aus, um die Funktion nach ihrer Definition zu deaktivieren (dh ihre Definition aufzuheben) unset -f sudo
. Führen Sie Folgendes aus, um den regulären sudo
Befehl direkt manuell auszuführen, auch wenn die Shell-Funktion definiert ist command sudo
. Beachten Sie jedoch, dass Sie nicht haben , dass zu tun, denn diese sudo
Funktion , dass sich tatsächlich tut , wenn es mehr oder weniger als zwei an sie übergebenen Argumente oder das erste Argument übergeben , um es alles andere als ist cd
. Aus diesem Grund können Sie es weiterhin wie gewohnt verwenden sudo
.
Beachten Sie auch, dass Sie mit der oben gezeigten Shell-Funktion noch andere Argumente übergeben können sudo
, diese jedoch nicht cd
speziell behandeln können . Insbesondere das Ausführen wird nicht unterstützt, obwohl Sie die Shell-Funktion erweitern können, um diesen Fall zu unterstützen. Ist es auch nicht . Die Shell, die es erstellt, ähnelt dem, was Sie mit bekommen . Der Code wird nicht ausgeführt , sondern verwendet , sodass die Option ordnungsgemäß funktioniert. Es wird tatsächlich zweimal ausgeführt, wenn Sie ein Verzeichnisargument übergeben (und ansonsten nullmal). Beim Ausführen wird zuerst eine andere Bash-Shell als die, in der Sie die Funktion ausführen , entfernt und das Verzeichnis geändert. Wenn das gelingt, ersetzt essudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
diese Bash-Shell mit einer neuen, interaktiven, die Sie verwenden können.
Hier ist ein Beispiel, wie diese Shell-Funktion automatisch "das Richtige tut". Beachten Sie, dass sudo ls -A /root
sich das normal verhält. Erst wenn ich dann versuche, cd
ein Verzeichnis mit sudo
einer neuen Shell anzulegen, werde ich explizit daran erinnert, was los ist.
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:~$
Wenn Sie versuchen, sudo cd
in ein Verzeichnis zu wechseln, in das Sie nicht einmal als Root wechseln können, erhalten Sie nur eine Fehlermeldung:
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
In den obigen Beispielen habe ich zwischen zwei Aufrufen gezeigt, dass Sie als Root authentifiziert werden, bevor Sie versuchen, das Verzeichnis zu ändern. Aber du musst eigentlich nicht sudo -k
selbst rennen . Da die Shell-Funktion nur ein dünner Wrapper für den eigentlichen sudo
Befehl ist , funktionieren die Zwischenspeicherung Ihrer Anmeldeinformationen und anderer gängiger sudo
Verhaltensweisen weiterhin normal.
Obwohl es gut funktioniert und irgendwie ordentlich ist, gebe ich zu, dass sudo
es super seltsam ist , den echten Befehl mit einer gleichnamigen Funktion zu beschatten . Die meisten Benutzer werden wahrscheinlich wollen nur die Schritte ausführen sudo -s
, selbst. Aber falls jemand dies will - und auch demonstrieren will, dass es möglich ist - dann ist es da.cd directory
ls -l
des Verzeichnisses selbst hinzu.