Ich habe .bashrc
mit einer Reihe von Alias angepasst , speziell ll
undexport LS_OPTIONS='--color=auto'
Leider funktioniert dies nicht, wenn es mit verwendet wird sudo
, daher habe ich auch Änderungen vorgenommen /root/.bashrc
, aber dies scheint keinen Unterschied gemacht zu haben.
sudo env
zeigt HOME=/root
undSHELL=/bin/bash
Wie kann ich sudo
Befehle erhalten, um die Einstellungen in zu verwenden /root/.bashrc
?
Ich verstehe, dass dies nur geschieht, wenn bash
es interaktiv ausgeführt wird, und bin daher offen für weitere Vorschläge zur Anpassung.
/root/.bashrc
aber wirklich, was das Q ist, sind die Aliase aus dieser Datei - dies ist nicht möglich - unix.stackexchange.com/questions/1496/… .-r
Option fürcrontab
: zu "deaktivieren"crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}
. Dies funktioniert, wenn Sie als einer der Benutzer angemeldet sind. Wenn ichsudo crontab -r
es jedoch ausführe, wird es weiterhin ausgeführt.Antworten:
sudo
führt eine ausführbare Datei aus, keinen Shell-Befehl. Es weiß also nichts über Aliase. Wenn Sie ausgeführt werdensudo ls
, wirdsudo /bin/ls
keinls
Alias verwendet, den Sie möglicherweise haben.Sie können
sudo ls
den Alias erweitern, indem Sie Folgendes in Ihr Feld einfügen.bashrc
:Beachten Sie den nachgestellten Leerzeichen, der die Shell anweist, die Alias-Erweiterung mit dem folgenden Wort fortzusetzen
sudo
. Beachten Sie, dass das Erweitern von Aliasen nach sudo möglicherweise nicht immer eine gute Idee ist. Dies hängt davon ab, welche Arten von Aliasen Sie haben.Darüber hinaus entfernt sudo die meisten Variablen aus der Umgebung. Dies wirkt sich nicht auf einen Alias wie aus
alias ls='ls $LS_OPTIONS'
, da dies eine Shell-Variable ist, die von der Shell verwendet wird, während der Befehl erweitert wird (und dessen Exportieren.bashrc
keinen Zweck erfüllt). Dies würde sich jedoch auf Variablen auswirken, die vom Befehl verwendet werden, zLS_COLORS
. Sie können sudo so konfigurieren, dass bestimmte Umgebungsvariablen beibehalten werden, indem Sie die Konfiguration bearbeiten: Führenvisudo
Sie die Zeile aus und fügen Sie sie hinzuMit diesen Einstellungen erhalten
sudo ll
Sie die Farben, die Sie gewohnt sind.Alternativ können Sie eine Root-Shell mit ausführen
sudo -s
. Diese Shell lädt ihre Konfigurationsdatei (~/.bashrc
für Bash). Abhängig davon, wie sudo konfiguriert ist, bleibt dies möglicherweiseHOME
in Ihrem Home-Verzeichnis oder ändert es in/root
. Sie können erzwingen, dass das Home-Verzeichnis auf root mit gesetzt wirdsudo -Hs
. Um das ursprüngliche Home-Verzeichnis beizubehalten, führen Sie umgekehrt aussudo env HOME="$HOME" bash
.quelle
Vielen Dank an diejenigen, die geantwortet haben und mich aufgefordert haben,
man sudo
genauer zu lesen .sudo -s
Wenn kein Befehl angegeben wird, wird eine interaktive Shell ausgeführt.Diese interaktive Shell verwendet
/root/.bashrc
und enthält somit meine Anpassungen.Der Befehl muss zwar separat eingegeben werden, dies ist jedoch in Ordnung.
quelle
Hintergrund
Ich hatte immer das Gefühl, dass diese Frage ein XY-Problem ist . Der Titel impliziert, dass sie etwas davon wollen,
/root/.bashrc
aber wirklich, was die Frage ist, sind die Aliase aus dieser Datei - dies wird allgemein als nicht möglich angesehen - Warum erkennt mein Bash-Skript keine Aliase? .Grundsätzlich ist es beabsichtigt, dass Ihre Aliase nicht an
sudo
und an anderen Orten erfasst werden, da sie nicht tragbar sind, und dies ist auch meine Meinung zu ihnen.Alles, was sich in der Benutzerumgebung befindet, sollte nicht von Skripten und Software übernommen werden, die möglicherweise auf einer bestimmten Box ausgeführt wird. Mir ist jedoch klar, dass es Szenarien gibt, in denen möglicherweise Aliase in einem bestimmten Benutzerkonto vorhanden sind
$HOME/.bashrc
, die andere in interaktiven Szenarien nutzen möchten.Zu diesem Zweck können Sie den Bash-Interpreter einfach anweisen, alle Aliase, die er während des Anmeldevorgangs findet, außerhalb des normalen Shell-Verhaltens zu erweitern, auf das Sie bei der Verwendung stoßen
sudo
.Beispiel
Konfiguration
Zum Einrichten habe ich die folgenden Aliase, Umgebungsvariablen und Funktionen zu meinen Root-Benutzern
/root/.bashrc
und/root/.bash_profile
Dateien hinzugefügt .Ohne irgendetwas zu tun, keine dieser Arbeiten (keine Überraschungen):
Wir sehen, dass der
alias
Befehl beim Ausführen keine Aliase anzeigtsudo
:Dieses Verhalten ist Ihr Hinweis darauf, dass Sie nicht erwarten sollten, dass auf Aliase zugegriffen werden kann. Aber wir machen weiter ...
Schritt 1 - Aliase sichtbar
Wenn wir rennen
bash -ci
, können wir Bash dazu bringen, zumindest Folgendes zu lesen$HOME/.bashrc
:Cool, also können wir es vielleicht laufen lassen?
Schritt 2 -
shopt -s expand_aliases
Nee. Auch dies ist beabsichtigt, wir tun etwas, was wir nicht tun sollen, also gibt es eine Reihe von "Sicherheitsvorkehrungen", die wir deaktivieren müssen. Die andere "Sicherheit" ist Bash.
Hier sehen wir unsere Nachricht von
/root/.bashrc
, wir haben den Alias des Root-Benutzers erfolgreich ausgeführtbrc_smurf
.Schritt 3 - Was ist mit env vars?
Wenn Sie die oben gezeigte Methode verwenden, sollten diese jetzt auch funktionieren.
Schritt 4 - was ist mit Funktionen?
Dies funktioniert auch wie erwartet:
TLDR;
Sie können dies tun, um Zugriff auf Umgebungsvariablen + Aliase zu erhalten von
/root/.bashrc
:Nehmen Sie weg
Diese Methode aktiviert den Inhalt von
/root/.bashrc
, nimmt den Inhalt von nicht auf/root/.bash_profile
.Verweise
quelle
.bashrc
sudo; speziell die-r
Option entfernen voncrontab
?sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'
statt eines einfachensudo echo $brc_smurf_env
?alias
, das war nur, um sie zu zeigen, Sie müssten tunsudo bash -ci 'shopt -s expand_aliases; <cmds>'
Es gibt eine Reihe von Einstellungen in der Datei / etc / sudoers, die speziell für die Ausführung von sudo-Befehlen oder zum Einrichten einer Umgebung für die Ausführung von sudo-Befehlen eingerichtet sind (z. B. Sicherstellen, dass der PATH nur vertrauenswürdige Speicherorte hat), je nachdem, was Sie davon erwarten Möglicherweise können Sie nicht das tun, wonach Sie suchen, wenn Sie tatsächliche Befehle in einer Shell ausführen müssen, um die Umgebung einzurichten. Sudoing bietet Ihnen keine Root-Login-Shell, sodass kein reguläres Profil für Sie erstellt wird.
quelle
Nehmen wir an, wir bearbeiten /root/.bashrc wie folgt:
Lasst uns abmelden und wieder anmelden, damit bash die Datei liest:
Wie Sie sehen können, wurde die Datei gelesen, der Pfad wurde geändert und die Aliase wurden festgelegt. Alles ist funktionsfähig, wie Sie es wünschen.
Sudo funktioniert jedoch immer noch nicht wie erwartet.
PATH hat sich nicht geändert. Es kann Möglichkeiten geben, den Pfad in Sudoern zu ändern, aber ich empfehle Ihnen dringend, dies zu vermeiden. Außerdem werden Aliase, Funktionen und einige andere Änderungen immer noch nicht angewendet, wenn nur der Pfad geändert wird. Eine Datei muss bezogen werden. Wenn Sie dies für jedes Skript oder jeden Befehl tun, wird der Computer aufgefordert, mehr Arbeit ohne wirklichen Nutzen auszuführen. In Skripten werden keine Aliase verwendet (in Skripten gibt es keine praktische Verwendung).
Melden Sie sich einfach an, die
.bashrc
Datei wird automatisch geladen und macht sich an die Arbeit.Sie können Bash wie folgt starten:
Aber wie Sie oben sehen, hat sich das pwd (das Arbeitsverzeichnis) nicht geändert, und wenn Sie etwas mehr untersuchen, haben sich auch einige andere Einstellungen nicht geändert. Deshalb lautet der richtige Befehl:
Wenn dieser Befehl zu lang ist, um ihn einzugeben, erstellen Sie einen Alias oder eine Funktion im Benutzer (nicht root), in der dieser Befehl verwendet wird.
quelle
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: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ührensudo ll
nur funktioniert, wenn sichll
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ührensudo bash
, obwohl modernsudo
(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 dersudo bash -c 'll'
Annahme, dass$SHELL
es sich um Bash handelt, was aufgrund der vonrcfile
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 wirdsudo -i ll
(äquivalent zusudo bash -l -c 'll'
) immer noch nicht funktionieren. So , wie das möglich ist, da es hat die Definition des Lesell
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
(oderbash -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 :
(Es ist natürlich auch in Ordnung, sowohl login als auch interaktiv zu sein
bash -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:
(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 :Und wenn Sie eine längere Befehlszeile mit Argumenten haben, können Sie diese auch hier direkt übergeben:
(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:
Könnte in diese Funktion umgewandelt werden:
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!
quelle
sudo -i command arguments
Lage sein , laufen Funktionen aus/root/.bashrc
verfügbar und haben exportierten Variablen. Aber ich sehe, dass meine Antwort vielleicht zu lang war und diese Informationen etwas vergraben waren ... Also habe ich eine TL; DR hinzugefügt, um sie zusammenzufassen (während die technischen Details der Untersuchung beibehalten wurden). Bitte werfen Sie einen weiteren Blick darauf.