Warum ignoriert sudo Aliase?

22

Ich verwende Ubuntu 10.04 und verwende es upstartfür die Daemon-Verwaltung. Meine Unternehmensanwendung wird als Daemon ausgeführt und muss aufgrund verschiedener Berechtigungen als Root ausgeführt werden. Z.B:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc

Ich möchte einen einführen, aliasum diese Befehle als etwas abzukürzen:

alias startapp='sudo start my-application-long-ID'

und starte es so startappund das funktioniert aber ich würde es vorziehen kein sudo im alias zu haben.

alias startapp='start my-application-long-ID'

nicht bei lauf mit sudo startapp, rückkehr sudo: startapp: command not found.

Als ich jedoch den Alias ​​hinzufügte:

alias sudo='sudo '

sudo startapp Jetzt funktioniert, aber ich bin immer noch gespannt, warum Sudo Aliase ignoriert.

amphibient
quelle
Bist du gelaufen source ~/.bashrc? Dadurch wird die .bashrc-Datei aktualisiert und die neuen Aliase verfügbar gemacht.
Manu
@ Manu Ja, ich habe
amphibient

Antworten:

35

Ich sehe die folgenden Informationen von hier .

Verwenden Sie bei Verwendung von sudo die Alias-Erweiterung (andernfalls ignoriert sudo Ihre Aliase).

alias sudo='sudo '

Der Grund, warum es nicht funktioniert, wird hier erklärt .

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 bash auf einen Alias ​​überprüft, ll wird ignoriert. 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.

Ramesh
quelle
6

Aliase und Funktionen werden in einer Shell definiert. Sudo ist ein externes Programm. Daher werden in sudo keine Aliase, Funktionen oder Shell-Builtins angezeigt, sondern nur externe Befehle.

Aliase sind als alternative Befehlsnamen gedacht, daher erweitern Shells sie nur an der Befehlsposition, nicht wenn es sich um Argumente für Befehle handelt. Zsh unterstützt globale Aliase, die an einer beliebigen Stelle in der Befehlszeile erweitert und am besten sparsam verwendet werden, da die Gefahr besteht, dass sie versehentlich erweitert werden, selbst in Kontexten, in denen der Alias ​​keinen Sinn ergibt.

Sie können sudo sagen eine Shell aufzurufen: sudo sh -c '…shell command here…'. Ihre übliche Aliase nicht verfügbar innen sein , dass Shell - Befehl, jedoch, da sie normalerweise in einer Datei wie gespeichert ~/.bashrcoder ~/.zshrcdie nur durch interaktiven Shells gelesen wird.

alias sudo='sudo 'bewirkt , wie von Ramesh vorgeschlagen , dass die Shell Aliase danach erweitert sudo.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Funktioniert das auch alias sudo='sudo 'für das ZSH?
CMCDragonkai
2
@CMCDragonkai Ja
Gilles '
1

Eine Lösung für zsh-Benutzer

In Bash und Zsh bewirkt das Beenden eines Alias ​​mit einem Leerzeichen, dass die Shell das nächste Wort mit einem Alias ​​erweitert. Dies ermöglicht es, so etwas wie den folgenden Alias ​​zu erweiternmyalias

alias 'sudo=sudo '
sudo myalias

Leider fällt dies auseinander, wenn Sie mehr als ein Wort in Ihrem Alias ​​haben (wie sudo -u someone. Sie können jedoch die zsh-Funktion "Globale Aliase" missbrauchen, um Aliase an einer beliebigen Stelle im Befehl manuell zu erweitern.

alias -g '$= '

Dadurch wird ein globaler Alias ​​erstellt $(Sie können ein beliebiges Wort verwenden), der in einem Leerzeichen endet. Dies bewirkt, dass zsh das nächste Wort als regulären Befehlsalias erweitert. Da der Alias ​​zu Leerzeichen erweitert wird, wird er nicht als Argument behandelt. Dies ermöglicht Folgendes zu arbeiten.

% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo

Sie können sogar $mehrere Male in einer Befehlszeile verwenden, wenn Sie eine komplizierte Befehlsverschachtelung haben. Ich fand das nützlich genug, dass es einen festen Platz in meinem zshrc hat, aber der Alias ​​ist einfach genug, um zu definieren, wann Sie ihn verwenden müssen.

Kevin Cox
quelle
0

Ich habe hier nur eine alternative Antwort gegeben , ohne sie sudomit einem Alias ​​neu zu definieren.

In Ihrem Fall wäre es:

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

Alles in einer Zeile, keine zusätzlichen Shells, keine Alias-Neudefinitionen. ;-)

geliebt.von.Jesus
quelle
Oh, warte eine Minute - ich verstehe - du benutzt es xargs, um die Anführungszeichen zu entfernen, und grep, um die Führungszeichen zu entfernen =. Ein bisschen schlau, aber wahrscheinlich unnötig. eval "sudo $(alias aliasname | cut -d= -f2-)"ist wahrscheinlich besser - xargswird nicht immer mit den Anführungszeichen richtig umgehen, und es könnte mehr als eins =geben.
mikeserv
@mikeserv Es tut mir leid, dass Sie es nicht verstanden haben ;-) Entfernen Sie xargsnicht die Anführungszeichen. Es ist grep, der den aufgelösten Befehl zwischen den Anführungszeichen entnimmt. Sie wissen, type -a alias_namekehrt so etwas zurück alias_name is aliased to command_within_quotes. Übrigens habe ich Ihren Befehl ausprobiert und auf meinem Ubuntu nicht funktioniert :-(. Ist es die Rückkehr von type -averschiedenen Linux-Versionen? (Ich bezweifle es).
Geliebt von Jesus
Ich weiß was type- in bash. Sie verstehen aber, dass die Anführungszeichen verdoppelt sind, oder? Haben Sie es mit einem Alias ​​versucht, der einfache Anführungszeichen enthielt? Wie auch immer, Sie haben Recht damit, dass mein Ding nicht funktioniert - Sie brauchen entweder eval "sudo sh -c "$(...oder eval "'sudo $(alias alias_name| cut -d\' -f2-)". Die Sache ist, dass aliases im Grunde voreingestellt ist eval- das aliasDienstprogramm ist darauf ausgelegt, ihren Inhalt auszugeben, damit er sicher wieder in die Shell eingegeben werden kann. Ich vermute, Sie xargssind dann implementiert, um das Leerzeichen zu reduzieren? Sei einfach vorsichtig damit, ok?
mikeserv