Bei Verwendung von sudo sind keine Aliase verfügbar


161

Ich habe heute mit Aliasen herumgespielt und festgestellt, dass Aliase während der Verwendung nicht verfügbar zu sein scheinen 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 während der Verwendung keine Aliase verwenden können sudo?


Haben Sie diesen Alias ​​in .bashrc unter / root /
Luciano Facchinelli am

2
@LucianoFacchinelli: Wird /root/.bashrcbeim Ausführen eines Befehls über sudo nicht gelesen.
Flimm


@Flimm: Was ist mit sudo -i?
Evi1M4chine

Antworten:


251

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

alias sudo='sudo '

Aus dem Bash-Handbuch :

Aliase ermöglichen das Ersetzen eines Wortes durch eine Zeichenfolge, wenn es als erstes Wort eines einfachen Befehls verwendet wird. Die Shell verwaltet eine Liste von Aliasen, die mit den integrierten Befehlen alias und unalias festgelegt und deaktiviert werden können.

Das erste Wort jedes einfachen Befehls wird, wenn es nicht in Anführungszeichen gesetzt ist, überprüft, um festzustellen, ob es einen Alias ​​hat . In diesem Fall wird dieses Wort durch den Text des Alias ​​ersetzt. Die Zeichen '/', '$', '' ',' = 'und alle oben aufgeführten Shell-Metazeichen oder Anführungszeichen erscheinen möglicherweise nicht in einem Aliasnamen. Der Ersetzungstext kann eine gültige Shell-Eingabe enthalten, einschließlich Shell-Metazeichen. Das erste Wort des Ersetzungstextes wird auf Aliase geprüft, ein Wort, das mit einem zu erweiternden Alias ​​identisch ist, wird jedoch nicht ein zweites Mal erweitert. Dies bedeutet, dass beispielsweise ein Alias ​​"ls" für "ls -F" verwendet werden kann und Bash nicht versucht, den Ersetzungstext rekursiv zu erweitern. Wenn das letzte Zeichen des Alias-Werts ein Leerzeichen oder ein Tabulatorzeichen ist, wird auch das nächste Befehlswort nach dem Alias ​​auf Alias-Erweiterung überprüft .

(Hervorhebung von mir).
Bash prüft nur das erste Wort eines Befehls auf einen Alias, alle Wörter danach werden nicht geprüft. Das heißt, in einem Befehl wie sudo ll, wird nur das erste Wort ( sudo) von der Bash auf einen Alias ​​überprüft und llignoriert. Wir können bash anweisen, das nächste Wort nach dem Alias ​​(dh sudo) zu überprüfen, indem Sie am Ende des Alias-Werts ein Leerzeichen einfügen.


18
Ziemlich schöne Lösung.
ulidtko

Im Grunde läuft das Problem also darauf hinaus, dass sudo einfach so programmiert ist, dass es nicht prüft, ob ein Alias ​​gefunden wurde.
kemra102

2
Das Lesen der Dokumentation hat natürlich eine Menge Vorteile :-)
Biocyberman

4
Wird dies brechen, wenn ich eine Sudo-Flagge verwende, zB sudo -H ll?
Mark E. Haase

1
@mehaase Ja, ich habe es versucht und es bricht.
user31389

5

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

Es wird überprüft, ob ich einen Alias ​​für den angegebenen Befehl habe, und der Aliasbefehl wird sudoin diesem Fall anstelle des Literalbefehls mit ausgeführt .

Hier ist meine Funktion als Einzeiler:

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 .bashrcDatei anhängen , die Quelle nicht vergessen oder die Terminalsitzung anschließend neu starten, um die Änderungen zu übernehmen.


Es wäre wunderbar, wenn dies auch für sudo -H ll funktionieren würde.
UAV

3

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


3
Sie befinden sich bereits unter /root/.bashrc, das ist also kein Problem
kemra102

1
Diese Antwort würde die Situation nur dann richtig, wenn Sie die Schale selbst als root laufen lassen , wie mit sudo -soder sudo -i(und nur , wenn sie von selbst läuft ein Root - Shell zu bekommen, nicht mit den sudo -s command...oder sudo -i command...Formularen) oder sudo bashoder sudo suoder der Situation , in der Sie habe root-logins aktiviert und habe so eine root-shell. Wenn ein Benutzer ohne Rootberechtigung sudo command...von seiner eigenen Shell ausgeführt wird, wird die Alias-Erweiterung von seiner eigenen Shell ohne Rootberechtigung durchgeführt. sudoErweitert selbst keine Aliase, daher ist diese Antwort in Bezug auf die in der Frage beschriebene Situation falsch.
Eliah Kagan

3

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

Ich dachte jedoch an eine Befehlszeilenlösung, um einen Alias-Befehl in sudo auszuführen, bei dem es nicht erforderlich ist, ihn sudomit einem aliasBefehl neu zu definieren .

Hier ist mein Vorschlag für diejenigen, für die es interessant sein könnte:

Lösung

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

Beispiel

Im Falle des llBefehls

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

Erläuterung

Wenn Sie einen Alias ​​(z. B. :) haben, gibt der llBefehl type -aden Alias-Ausdruck zurück:

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

Wählen grepSie mit den Text zwischen dem Akzent "und Apostroph" in diesem Fallls -l

Und xargsführt den ausgewählten Text ls -lals Parameter von aus sudo.

Ja, ein bisschen länger, aber komplett sauber ;-) Keine Notwendigkeit, sudoals Alias neu zu definieren .


3
aliasKönnte einfacher sein, wenn Sie das eingebaute verwenden, da die Ausgabe sauberer ist. alias llAusgänge alias ll='ls -ahlF'.
muru

Hier ist die Version @ muru Vorschlag enthält: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo.
ACK_stoverflow

Ich denke, der Sinn der ursprünglichen Frage war es, Arbeit zu sparen, indem man nicht sudo -izuerst den Alias-Befehl ausführen muss, sondern ihn sofort ausführt. Ein so komplexer Befehl besiegt das. Sie könnten einfach das erstere tun und viel schneller sein.
Evi1M4chine

1

Ich habe noch eine nette Lösung, die auch ein bisschen Vertrauen schafft:

Verwenden Sie die Bash-Vervollständigung, um die dahinter stehenden Wörter sudobeim Drücken der Tabulatortaste automatisch durch ihre Aliase zu ersetzen .

Speichern Sie dies als /etc/bash_completion.d/sudo-alias.bashcomp, und es sollte automatisch beim Start der interaktiven Shell 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

Melden Sie sich dann bei einem neuen Terminal an, und schon kann es losgehen.


Es gibt eine Möglichkeit, eine Liste der Aliase compgen -a
abzurufen

@muru: Danke, aber in diesem Fall brauche ich die Werte, nicht die Schlüssel. So wird das eingegebene Alias ​​ersetzt. Sie geben den Alias ​​ein (wie in sudo ll), drücken [TAB AB] und das Skript findet ihn llin der Liste der Aliaszuweisungen, schneidet ihn aus und fügt ihn ein. (So ​​würden Sie zB bekommen sudo ls -lahvF --color=auto --time-style=long-iso.)
Evi1M4chine

0

Ich habe eine andere Lösung, bei der Sie nicht sudoals Alias hinzufügen müssen . Ich verwende Linux Mint 17.3, aber es sollte Ubuntu ziemlich ähnlich sein.

Wenn Sie als Root angemeldet sind, .profilewird das von seinem Home-Verzeichnis ausgeführt. Wenn Sie nicht wissen, wie das Basisverzeichnis unter root lautet, können Sie Folgendes überprüfen:

sudo su
echo $HOME

Wie Sie sehen können, die Heimat von rootist /root/. Überprüfen Sie den Inhalt:

cd $HOME
ls -al

Es sollte eine .profileDatei geben. Öffnen Sie die Datei und fügen Sie die folgenden Zeilen hinzu:

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

Grundsätzlich sucht dieses Bash-Skript nach einer aufgerufenen Datei .bash_aliases. Wenn die Dateien vorhanden sind, wird die Datei ausgeführt.

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

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


0

Die Antwort mit den meisten Stimmen ist großartig. Wenn Sie sudo -ijedoch eine sudo-Eingabeaufforderung ( #) eingeben und die Anführungszeichen setzen, werden Sie nicht über die Aliase verfügen, die Sie verwenden möchten.

Um Ihre Aliase (und alles andere) an der #Eingabeaufforderung zu verwenden, verwenden Sie:

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

Wobei "$ PWD" automatisch zu "/ home / YOUR_USER_NAME" erweitert wird


0

@ WinEunuuchs2Unix: $PWDerweitert auf das "aktuelle Arbeitsverzeichnis". Ich denke du willst $HOME.

In den meisten Situationen ist es wahrscheinlich am besten, eine separate .bashrc-Stammdatei zu haben. Tatsächlich würde ich es zu einer echten Datei machen, einen /rootSoftlink dazu im Home-Verzeichnis .bashrc_rootdes Benutzers .bashrcerstellen (z. B. ) und es aus der Datei des Benutzers beziehen. Wenn dieses privilegierte Benutzerkonto zu einem späteren Zeitpunkt nicht mehr vorhanden ist, ist die Stammdatei .bashrcfür andere Benutzer weiterhin verfügbar.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.