Bei Verwendung von sudo sind keine Aliase verfügbar

135

Ich habe heute mit Aliases rumgespielt und habe bemerkt, dass Aliase scheinbar nicht verfügbar sind, wenn Sie sudo :

verwenden
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 bei der Verwendung von sudo keine Aliase verwenden können?

    
kemra102 17.01.2011, 23:47
quelle

8 Antworten

213

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

alias sudo='sudo '

Im Bash-Handbuch :

  

Durch Aliase kann ein Wort durch eine Zeichenfolge ersetzt werden, wenn es als erstes Wort eines einfachen Befehls verwendet wird. Die Shell verwaltet eine Liste von Aliasnamen, die mit den integrierten Befehlen für Aliasnamen und Unaliasnamen festgelegt und aufgehoben werden können.

     

Wenn das erste Wort eines einfachen Befehls nicht in Anführungszeichen gesetzt ist, wird geprüft, ob es einen Alias enthält. Wenn ja, wird dieses Wort durch den Text des Alias ersetzt. Die Zeichen "/", "$", "'", "=" und alle oben aufgeführten Shell-Metazeichen oder Anführungszeichen werden möglicherweise nicht in einem Aliasnamen angezeigt. Der Ersetzungstext kann jede gültige Shell-Eingabe enthalten, einschließlich Shell-Metazeichen. Das erste Wort des Ersetzungstextes wird auf Aliase getestet, aber ein Wort, das mit einem erweiterten Alias identisch ist, wird nicht ein zweites Mal erweitert. Dies bedeutet, dass zum Beispiel ein Alias auf "ls -F" gesetzt werden kann und Bash nicht versucht, den Ersetzungstext rekursiv zu erweitern. Wenn das letzte Zeichen des Aliaswerts ein Leerzeichen oder ein Tabulatorzeichen ist, wird das auf den Alias folgende nächste Befehlswort auch auf Aliaserweiterung geprüft.

(Betonungsbergwerk).
Bash prüft nur das erste Wort eines Befehls auf einen Alias, alle folgenden Wörter werden nicht geprüft. Das heißt, in einem Befehl wie sudo ll wird nur das erste Wort ( sudo ) von bash auf einen Alias geprüft, ll wird ignoriert. Wir können bash anweisen, das nächste Wort nach dem Alias zu prüfen (d. H. sudo ), indem Sie am Ende des Aliaswerts ein Leerzeichen hinzufügen.

    
Isaiah 18.01.2011, 00:08
quelle
5

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

beschattet

Überprüft, ob ich einen Alias für den angegebenen Befehl habe, und führt den Alias-Befehl anstelle des literalen Befehls mit sudo in diesem Fall aus.

Hier ist meine Funktion als Einzeiler:

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

Oder schön formatiert:

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

Sie können es an Ihre .bashrc -Datei anhängen, es nicht vergessen, es zu quellen oder Ihre Terminalsitzung danach neu zu starten, um die Änderungen zu übernehmen.

    
Byte Commander 27.09.2016 11:19
quelle
3

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

definieren     
Ragnar123 18.01.2011 00:01
quelle
3

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

Allerdings dachte ich an eine Befehlszeilenlösung, um einen Aliasbefehl in Sudo auszuführen , bei dem sudo nicht mit einem Befehl alias neu definiert werden muss.

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

Lösung

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

Beispiel

Im Fall des Befehls ll

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

Erläuterung

Wenn Sie einen Aliasnamen haben (z. B. ll ), gibt der Befehl type -a den Alias-Ausdruck zurück:

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

Mit grep wählen Sie in diesem Fall ls -l

den Text zwischen Akzent 'und Apostroph' aus

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

Ja, etwas länger, aber vollständig sauber ;-) Es ist nicht erforderlich, sudo als Alias neu zu definieren.

    
loved.by.Jesus 15.02.2015 20:37
quelle
1

Ich habe eine andere nette Lösung, die auch etwas Vertrauen schafft:

Verwenden Sie die Bash-Vollendung, um Wörter hinter sudo automatisch durch ihre Aliase zu ersetzen, wenn Sie die Tabulatortaste drücken.

Speichern Sie dies unter /etc/bash_completion.d/sudo-alias.bashcomp und es sollte beim interaktiven Start der Shell automatisch geladen werden:

_comp_sudo_alias() { from=""; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$//" )" )
    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 Sie sollten sich auf den Weg machen.

    
Evi1M4chine 08.09.2017 18:09
quelle
0

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

Wenn Sie root sind, wird .profile vom Ausgangsverzeichnis aus ausgeführt. Wenn Sie nicht wissen, was das Ausgangsverzeichnis unter root ist, können Sie Folgendes überprüfen:

sudo su
echo $HOME

Wie Sie sehen, ist root die Heimat von /root/ . Überprüfen Sie den Inhalt:

cd $HOME
ls -al

Es sollte eine .profile -Datei vorhanden sein. Ö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 besteht dieses Bash-Skript darin, nach einer Datei mit dem Namen .bash_aliases zu suchen. Wenn die Dateien vorhanden sind, wird die Datei ausgeführt.

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

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

    
Karthik Ramakrishnan 10.06.2016 23:06
quelle
0

Die am besten bewertete Antwort ist großartig. Wenn Sie jedoch sudo -i eingeben und zu einer Sudo-Eingabeaufforderung ( # ) erhöhen, haben Sie keine Aliase, die Sie verwenden möchten.

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

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

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

    
WinEunuuchs2Unix 25.11.2016 03:50
quelle
0

@ WinEunuuchs2Unix: $PWD erweitert sich zum "aktuellen Arbeitsverzeichnis". Ich denke, Sie wollen $HOME .

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

    
Shaun Griffith 06.10.2018 13:04
quelle

Tags und Links