it-swarm.com.de

Bei Verwendung von sudo sind keine Aliase verfügbar

Ich habe heute mit Aliasen herumgespielt und festgestellt, dass Aliase bei Verwendung von Sudo nicht verfügbar zu sein scheinen:

[email protected]:~$ 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'

[email protected]:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

[email protected]:~$ Sudo -i
[email protected]:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
[email protected]:~# exit
logout

[email protected]:~$ Sudo ll -d /
Sudo: ll: command not found

Gibt es einen Grund, warum Sie bei der Verwendung von Sudo keine Aliase verwenden können?

156
kemra102

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

alias Sudo='Sudo '

Aus dem bash manual :

Aliase ermöglichen das Ersetzen eines Worts 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 ​​ enthält. 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 das nächste auf den Alias ​​folgende Befehlswort ebenfalls auf Alias-Erweiterung überprüft .

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

246
Isaiah

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

Es wird überprüft, ob ich einen Alias ​​für den angegebenen Befehl habe, und der Aliasbefehl wird in diesem Fall anstelle des Literalbefehls mit Sudo 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 [email protected] ; fi }

Oder schön formatiert:

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

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

5
Byte Commander

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

3
Ragnar123

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

Ich dachte jedoch an eine Befehlszeilenlösung für Ausführen eines Alias-Befehls in Sudo, bei der es nicht erforderlich ist, Sudo mit einem alias -Befehl 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 Fall des Befehls ll

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

Erläuterung

wenn Sie einen Alias ​​haben (wie zum Beispiel: 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 den Text zwischen Akzent `und Apostroph 'in diesem Fall ls -l

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 ​​zu definieren.

3
loved.by.Jesus

Ich habe eine andere Nice-Lösung, die auch ein bisschen Vertrauen schafft:

Verwenden Sie die Bash-Vervollständigung, um Wörter hinter Sudo automatisch durch ihre Aliase zu ersetzen, wenn Sie die Tabulatortaste drücken.

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 Sie sollten einsatzbereit sein.

1
Evi1M4chine

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

Wenn Sie als Root angemeldet sind, wird der .profile aus seinem Ausgangsverzeichnis 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, ist die Heimat von root/root/. Überprüfen Sie den Inhalt:

cd $HOME
ls -al

Es sollte eine .profile Datei 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 Datei mit dem Namen .bash_aliases. 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 Aliase-Datei bereits bereit haben, kopieren Sie die Datei an diesen Speicherort

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

@ WinEunuuchs2Unix: $PWD wird zum "aktuellen Arbeitsverzeichnis" erweitert. 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 in /root machen, eine weiche Verknüpfung dazu im Home-Verzeichnis des Benutzers (z. B. .bashrc_root) herstellen und es aus der .bashrc -Datei des Benutzers beziehen. Wenn dieses privilegierte Benutzerkonto zu einem späteren Zeitpunkt nicht mehr vorhanden ist, ist die Datei root .bashrc für andere Benutzer weiterhin verfügbar.

0
Shaun Griffith

Die Antwort mit den meisten Stimmen ist großartig. Wenn Sie jedoch Sudo -i eingeben und zu einer Sudo-Eingabeaufforderung (#) aufsteigen, verfügen Sie nicht über die 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

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

0