Frage Aliase sind bei Verwendung von sudo nicht verfügbar


Ich habe heute mit Aliasen herumgespielt und mir ist aufgefallen, dass bei der Benutzung keine Aliase verfügbar sind sudo:

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

Gibt es einen Grund, warum Sie keine Aliase während der Verwendung verwenden können? sudo?


133
2018-01-17 22:47


Ursprung


Haben Sie diesen Alias ​​in .bashrc unter / root / deklariert? - Luciano Facchinelli
@ LucianoFacchinelli: /root/.bashrc wird nicht gelesen, wenn ein Befehl über sudo ausgeführt wird. - Flimm
serverfault.com/questions/61321/how-to-pass-alias-through-sudo - Ciro Santilli 新疆改造中心 六四事件 法轮功
@ Flimm: Was ist mit sudo -i? - Evi1M4chine


Antworten:


Fügen Sie die folgende Zeile zu Ihrer hinzu ~/.bashrc:

alias sudo='sudo '

Von dem Bash Handbuch:

Aliase erlauben es, eine Zeichenfolge durch ein Wort zu ersetzen, wenn sie als erstes Wort eines einfachen Befehls verwendet wird. Die Shell verwaltet eine Liste von Aliasen, die mit den eingebauten Befehlen alias und unalias gesetzt und deaktiviert werden können.

Das erste Wort jedes einfachen Befehls wird, wenn es nicht in Anführungszeichen steht, geprüft, um festzustellen, ob es einen Alias ​​enthält. Wenn ja, wird dieses Wort durch den Alias ​​ersetzt. Die Zeichen '/', '$', '' ',' = 'und ein beliebiges der Shell-Metazeichen oder -Zifferzeichen, die oben aufgeführt sind, werden möglicherweise nicht in einem Aliasnamen angezeigt. Der Ersetzungstext kann eine beliebige gültige Shell-Eingabe enthalten, einschließlich Shell-Metazeichen. Das erste Wort des Ersetzungstextes wird auf Aliase getestet, aber ein Wort, das mit einem zu expandierenden Alias ​​identisch ist, wird nicht ein zweites Mal erweitert. Dies bedeutet, dass man beispielsweise ls zu "ls -F" führen kann und Bash nicht versucht, den Ersetzungstext rekursiv zu erweitern. Wenn das letzte Zeichen des Alias-Werts ein Leerzeichen oder ein Tabulatorzeichen ist, wird das nächste Befehlswort, das dem Alias ​​folgt, ebenfalls auf Alias-Erweiterung geprüft.

(Schwerpunkt meiner).
Bash überprüft nur das erste Wort eines Befehls auf einen Alias, alle nachfolgenden Wörter werden nicht überprüft. Das bedeutet in einem Befehl wie sudo ll, nur das erste Wort (sudo) wird von bash auf einen Alias ​​überprüft, ll wird ignoriert. Wir können bash sagen, das nächste Wort nach dem Alias ​​zu überprüfen (d. H sudo) durch Hinzufügen eines Leerzeichens am Ende des Alias-Wertes.


209
2018-01-17 23:08



Ziemlich schöne Lösung. - ulidtko
Im Grunde läuft das Problem auf die Tatsache hinaus, dass Sudo einfach so programmiert ist, dass es Alias ​​nicht überprüft, also nicht gefunden wird? - kemra102
@DannyRoberts Siehe meine aktualisierte Antwort. - Isaiah
Das Lesen der Dokumentation kommt natürlich einer Menge zugute :-) - biocyberman
Wird das brechen, wenn ich eine Sudo-Flagge verwende, z. sudo -H ll? - Mark E. Haase


Ich habe dafür eine Bash-Funktion geschrieben, die Schatten wirft sudo.

Es prüft, ob ich einen Alias ​​für den gegebenen Befehl habe und führe den Alias-Befehl statt des Literalen mit sudo In diesem Fall.

Hier ist meine Funktion als One-Liner:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }

Oder schön formatiert:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

Sie können es an Ihre anhängen .bashrc Vergessen Sie nicht, die Datei zu löschen oder starten Sie anschließend Ihre Terminalsitzung neu, um die Änderungen zu übernehmen.


5
2017-09-27 09:19





Die Aliase sind benutzerspezifisch - Sie müssen sie definieren /root/.bashrc


3
2018-01-17 23:01



Sie sind bereits unter /root/.bashrc, das ist also kein Problem - kemra102
Diese Antwort würde nur für die Situation korrekt sein, wenn Sie die Shell selbst als root ausführen, wie mit sudo -s oder sudo -i (und nur wenn es von selbst ausgeführt wird, um eine Root-Shell zu erhalten, nicht mit dem sudo -s command... oder sudo -i command... Formen) oder sudo bash oder sudo suoder die Situation, in der Sie Root-Logins aktiviert haben und auf diese Weise eine Root-Shell haben. Wenn ein Nicht-Root-Benutzer ausgeführt wird sudo command... Aus ihrer eigenen Shell heraus erfolgt die Alias-Erweiterung durch ihre eigene Nicht-Root-Shell. sudo Aliases erweitert sich nicht, so wie auf die in der Frage beschriebene Situation angewendet, diese Antwort ist falsch. - Eliah Kagan


@ Alvins Antwort ist die kürzeste. Kein Zweifel! :-)

Allerdings dachte ich über eine Befehlszeilenlösung nach Führe einen Alias-Befehl in Sudo aus wo es keine Notwendigkeit gibt, neu zu definieren sudo mit einem alias Befehl.

Hier ist mein Vorschlag für diejenigen, die es interessieren könnten:

Lösung

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo

Beispiel

Im Falle der ll Befehl

type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo

Erläuterung

wenn Sie einen Alias ​​haben (zB: ll) der Befehl type -a Gibt den Alias-Ausdruck zurück:

$type -a ll
ll is aliased to `ls -l'

mit grep Sie wählen den Text zwischen dem Akzent `und Apostroph 'in diesem Fall ls -l

Und xargs Führt den ausgewählten Text aus ls -l als Parameter von sudo.

Ja, ein bisschen länger aber völlig sauber;-) Keine Notwendigkeit, neu zu definieren sudo als Alias.


3
2018-02-15 19:37



Könnte einfacher sein, wenn Sie die alias eingebaut, da seine Ausgabe sauberer ist. alias ll Ausgänge alias ll='ls -ahlF'. - muru
Hier ist die Version, die @ Murus Vorschlag enthält: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo. - ACK_stoverflow
Ich denke, der Punkt der ursprünglichen Frage war, Arbeit zu sparen, indem ich nicht musste sudo -iErstens, um den Alias-Befehl auszuführen, aber sofort. Einen solchen komplexen Befehl zu haben, besiegt das. Du könntest Ersteres tun und viel schneller sein. - Evi1M4chine


Ich habe noch eine nette Lösung, die auch ein wenig Vertrauen bringt:

Verwenden Sie bash completion, um automatisch Wörter zu ersetzen sudo mit ihren Aliasen beim Drücken der Tabulatortaste.

Speichere dies als /etc/bash_completion.d/sudo-alias.bashcompund sollte beim interaktiven Start der Shell automatisch geladen werden:

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

Loggen Sie sich dann in ein neues Terminal ein und Sie sollten gut gehen.


1
2017-09-08 16:09



Es gibt eine Möglichkeit, eine Liste mit Aliasen zu erhalten, die speziell für die Vervollständigung gedacht sind: compgen -a - muru
@muru: Danke, aber in diesem Fall brauche ich die Werte, nicht die Schlüssel. Also, was der Alias, der eingegeben wurde, wird durch ersetzt. Sie geben den Alias ​​ein (wie in sudo ll), drücken Sie [TAB ↹] und das Skript findet ll in der Liste der Aliaszuweisungen, schneidet aus, was ihm zugewiesen ist, und fügt das ein. (So ​​würden Sie z.B. sudo ls -lahvF --color=auto --time-style=long-iso.) - Evi1M4chine


Ich habe eine andere Lösung, die Sie nicht hinzufügen müssen sudo als Alias. Ich betreibe Linux Mint 17.3, aber es sollte Ubuntu ziemlich ähnlich sein.

Wenn Sie root sind, dann die .profile wird von seinem Home-Verzeichnis ausgeführt. Wenn Sie nicht wissen, was das Home-Verzeichnis unter root ist, können Sie Folgendes überprüfen:

sudo su
echo $HOME

Wie Sie sehen können, ist das Zuhause von root ist /root/. Überprüfen Sie den Inhalt:

cd $HOME
ls -al

Es sollte eine sein .profile Datei. Öffnen Sie die Datei und fügen Sie folgende Zeilen hinzu:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

Was dieses Bash-Skript eigentlich tut, ist die Suche nach einer Datei namens .bash_aliases. Wenn die Dateien vorhanden sind, wird die Datei ausgeführt.

Speichern Sie die .profile Datei und erstellen Sie Ihre Aliase in .bash_aliases. Wenn Sie die Alias-Datei bereits bereit haben, kopieren Sie die Datei an diesen Speicherort

Starten Sie das Terminal neu und Sie können loslegen!


0
2018-06-10 21:06





Die beste Wahl ist eine gute Antwort. Wenn Sie jedoch eingeben sudo -i und zu einer sudo-Eingabeaufforderung (#) Sie werden nicht die Aliase haben, die Sie verwenden möchten.

Um Ihre Aliase (und alles andere) im # Aufforderung, verwenden:

sudo cp "$PWD"/.bashrc /root/.bashrc

Wo "$ PWD" automatisch in "/ home / YOUR_USER_NAME" erweitert wird


0
2017-11-25 02:50