TL; DR: Sie können sudo -i
eine definierte Funktion/root/.bashrc
(aber keinen Alias) ausführen und haben auch Zugriff auf Variablen, die aus dieser Datei exportiert wurden:
sudo -i Befehlsargumente
Aliase funktionieren dort zwar nicht, aber Sie können sie leicht in Funktionen konvertieren, wenn Sie sie zur Verfügung stellen möchten sudo -i
.
Lesen Sie weiter für eine vollständige Analyse und weitere Details.
Hier gibt es einige Probleme, einige in der Funktionsweise von Sudo und einige in der Funktionsweise von Bash selbst ...
Standardmäßig sudo
wird nur nach Befehlen gesucht und die Shell umgangen, sodass das einfache Ausführen sudo ll
nur funktioniert, wenn sich ll
in einem der Verzeichnisse eine ausführbare Datei befindet $PATH
. Um Aliase (oder Funktionen) verwenden zu können, müssen Sie sicherstellen, dass eine Shell als Teil des Prozesses aufgerufen wird.
Eine Möglichkeit wäre, so etwas wie sudo sh
oder auszuführen sudo bash
, obwohl modern sudo
(ich teste dies auf sudo 1.8.19p1) Optionen -s
und -i
zu diesem Zweck hat.
Ein Versuch wäre also so etwas wie sudo -s ll
(was gleichbedeutend ist mit der sudo bash -c 'll'
Annahme, dass $SHELL
es sich um Bash handelt, was aufgrund der von rcfile
Ihnen erwähnten der Fall zu sein scheint ). Aber das funktioniert auch nicht, da die Shell nicht interaktiv gestartet wird. Nicht-Anmeldemodus, der keine seiner Startdateien liest. Es ist im Wesentlichen dasselbe, als ob Sie ein Shell-Skript schreiben und #!/bin/bash
es ausführen. Auf die Aliase (und Funktionen), die Sie in Ihrem ~/.bashrc
Skript haben, kann von diesem Skript aus nicht zugegriffen werden ...
Als nächstes folgt die -i
Option, mit der eine Anmeldeshell erstellt wird. Das ist mehr , viel versprechend, da es wird Ihre Startdateien lesen! Und doch wird sudo -i ll
(äquivalent zu sudo bash -l -c 'll'
) immer noch nicht funktionieren. So , wie das möglich ist, da es hat die Definition des Lese ll
Alias?
Nun, die nächste Erklärung hier ist, dass bash standardmäßig keine Aliase erweitert, außer wenn die Shell interaktiv ist ... Diese von sudo -i
(oder bash -l
) gestartete Shell ist eine Login- Shell, aber immer noch nicht interaktiv.
Der nächste Schritt ist also, eine interaktive Shell zu erhalten, die dann funktioniert :
sudo bash -i -c 'll'
(Es ist natürlich auch in Ordnung, sowohl login als auch interaktiv zu seinbash -l -i -c ...
.)
Eine andere Alternative besteht darin, weiterhin eine Anmelde- Shell (nicht interaktiv) zu verwenden, diese jedoch explizit zu bitten, Aliase zu erweitern. Dies funktioniert also auch:
sudo bash -l -O expand_aliases -c 'll'
(Der Fall, in dem bash interaktiv war, benötigte keine Login- Shell, da dies ausreicht, um die Initialisierungsdateien zu lesen, aber diese muss -l
sie lesen.)
Dies sind ziemlich lange Befehlszeilen ... Und sie erfordern auch, dass Sie den gesamten Shell-Befehl zitieren. Wenn Sie also einen Alias mit Argumenten aufrufen, müssen Sie all das in eine Zeichenfolge umwandeln ... Also ist es eine Art ungeschickt zu benutzen ...
Beachten Sie, dass ich früher über Aliase und Funktionen gesprochen habe ... Das war absichtlich so, da Funktionen hier tatsächlich viel praktischer sind. Sie benötigen nichts Besonderes (z. B. eine interaktive Shell oder das Festlegen einer bestimmten Option), um Funktionen auf einer Shell auszuführen, solange Sie deren Definition beziehen.
Wenn Sie also ll
eine Funktion anstelle eines Alias definieren, können Sie diese direkt mit der -i
Verknüpfung von sudo verwenden :
sudo -i ll
Und wenn Sie eine längere Befehlszeile mit Argumenten haben, können Sie diese auch hier direkt übergeben:
sudo -i ll -C -R /etc
(Vergleiche mit sudo bash -i -c 'll -C -R /etc'
.)
Funktionen sind auch viel flexibler und in der Regel einfacher zu warten ... Es ist normalerweise einfach, einen Alias in eine Funktion umzuwandeln. Die einzige Einschränkung besteht darin, immer dort zu verwenden, "$@"
wo zusätzliche Argumente erwartet werden (normalerweise am Ende des.) alias.)
Zum Beispiel dieser Alias:
alias ll='ls $LS_OPTIONS -l'
Könnte in diese Funktion umgewandelt werden:
ll () {
ls $LS_OPTIONS -l "$@"
}
Sie sind für die meisten Zwecke gleichwertig. Und wie bereits erwähnt, sollte die Funktion direkt von dort aus zugänglich sein sudo -i
, sodass dies ein zusätzlicher Bonus ist.
Ich hoffe, Sie finden diese Antwort und Erklärung hilfreich!
/root/.bashrc
aber wirklich, was das Q ist, sind die Aliase aus dieser Datei - dies ist nicht möglich - unix.stackexchange.com/questions/1496/… .