Frage Wie Alias ​​durch Sudo übergeben werden


Ich habe einen Alias, der einige Parameter an ein Werkzeug weitergibt, das ich oft benutze. Manchmal renne ich wie ich selbst, manchmal unter Sudo. Leider erkennt Sudo den Alias ​​nicht.

Hat jemand einen Hinweis, wie man den Alias ​​weitergeben kann?

In diesem Fall habe ich eine Reihe von Optionen für Perl beim Debuggen:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Manchmal muss ich meine Tools als root debuggen, also statt laufen:

pd ./mytool --some params

Ich muss es unter Sudo laufen. Ich habe viele Möglichkeiten ausprobiert:

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

Ich hoffte auf eine nette, prägnante Art und Weise, um sicherzustellen, dass mein aktueller pd-Alias ​​vollständig verwendet wurde (falls ich ihn später noch einmal anpassen muss), obwohl einige meiner Versuche überhaupt nicht prägnant waren. Mein letztes Mittel ist, es in ein Shell-Skript zu schreiben und das irgendwo zu platzieren, das Sudo finden kann. Aber Aliase sind manchmal soooo praktisch, dass es ein letzter Ausweg ist.


30
2017-09-01 20:44


Ursprung




Antworten:


EIN sehr elegante Lösung finden Sie im Archlinux-Wiki:

alias sudo='sudo '
# whitespace ---^

funktioniert, um alle Aliase an sudo.

Quelle: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


47
2017-09-07 21:58



Das ist ein toller Trick! Für die Neugierigen, die Erklärung aus dem Alias-Abschnitt in der Bash-Manpage: A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded. - Russell Davis
Dies sollte wirklich die akzeptierte Antwort sein. - Adrian Frühwirth
Es ist eine Schande, dass dies nicht für Funktionen funktioniert. - Ciro Santilli 新疆改造中心 六四事件 法轮功
Hinweis: Angenommen, Sie müssen eine passieren Möglichkeit zu sudo wieder, während ich das behalten wollte sudo- Durchführtrick zur gleichen Zeit. Auch das ist möglich: Um Optionen wieder zu verwenden, verwenden Sie \sudo. Der Backslash wird überschreiben der Alias. (Viele scheinen davon nichts zu wissen). Auf diese Weise können SieAchtung!) entfernen Sie sogar Dateien ohne irgendein Warnung, Vorrang vor dem alias rm='rm -i' allgemein angegeben in .bash-aliases, einfach durch Tippen \rm file-to-delete. - syntaxerror


Ich weiß nicht genau, was Sie zu tun versuchen. Ich kann zwei Möglichkeiten sehen:

Der richtige Weg

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

Dann ausführen pd ./mytool führt Ihren Debugging-Befehl als root aus, behält aber die Vorteile von sudo (Audit-Trail, das nicht aus einer root-Shell heraus arbeitet).

Beispiel:

insyte $ alias sid = 'sudo id'
insyte $ sid
uid = 0 (Wurzel) gid = 0 (Wurzel) Gruppen = 0 (Wurzel)

Der einfache Weg

Fügen Sie die Aliasnamen zu den Stammdaten hinzu .bashrc und benutzen sudo -i wann immer du sudo wurdest.

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root # exit
Ausfahrt
insyte $ sudo -i
Wurzel # fb
foo bar

10
2017-09-01 22:36



Facepalm ++ - das war zu offensichtlich, danke. - Tanktalus


Habe einfach zwei Aliase und verwende eine Variable

Ich sehe den Grund für die Verwendung nicht awk oder cut es sei denn, es ist nur der Kernalias einmal definiert, um es einfacher zu modifizieren. Wenn das der Fall ist, dann funktioniert das:

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

Hier ist eine vereinfachte Funktion, um Alias-Paare wie das obige zu erstellen:

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

Benutzen:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

Jetzt hast du pd und spd Plus ct und sct.

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'

3
2017-09-02 05:32





Ich wünschte, ich könnte zwei Antworten als "richtig" markieren. Den richtigen Weg von kombinieren Insyte's, um, aufschlussreicher Beitrag, mit der awk (oder geschnittenen) Lösung von Bill WeissDas habe ich mir ausgedacht:

alias spd="sudo $(alias pd | cut -d\' -f2)"

Jetzt werde ich das einfach in eine Shell-Funktion in meinem .bashrc oder etwas einfügen und dann "s" -Versionen all meiner Aliase erstellen, die ich als root ausführen möchte.

Aktualisieren: leichte Modifikation von Dennis WilliamsonDie simple Funktion vereinfacht die Bedienung:

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

Das bedeutet, ich muss nur "s" vor den gesamten Befehl setzen. Anstatt:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Ich füge nur die s in der Front hinzu.

salias pd='perl -Ilib -I/home/myuser/lib -d'

Und ich bin fertig. Sicher, der Computer macht ein bisschen mehr Arbeit, aber dafür ist ein Computer gedacht. :-)

Vielen Dank!


3
2017-09-01 22:55



Sie können Dinge als akzeptiert markieren (oder in der Lage sein), das heißt, sie als richtig zu markieren :) - Bill Weiss
Richtig - ich möchte markieren zwei Antworten als richtig :-P - Tanktalus
Warum nicht Slizzered's Antwort? alias sudo="sudo " funktioniert perfekt. - trusktr


von http://www.shellperson.net/using-sudo-with-an-alias/

alias sudo='sudo '

3
2018-03-08 21:25





Wäre es nicht einfacher, einfach ein Skript zu hacken, das Ihre Optionen enthält, und es dann irgendwo in einen der Ordner zu legen, der der Pfad für reguläres Konto und root ist? Es würde wirklich nicht viel von einem Skript brauchen.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

2
2017-09-01 21:17



Es muss tatsächlich "$ @" statt $ * sein, und das ist ein Teil des Grundes, warum ich generell versuche, es zu vermeiden. ;-) Es funktioniert, es verschwendet nur eine Menge Speicherplatz im Vergleich zu dem, was es enthält. - Tanktalus


Das ist grob, aber es funktioniert hier:

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c

2
2017-09-01 21:58



Ich habe hier eine unvollständige Lösung eingefügt, dann bearbeitet, um zu beheben. Der aktuelle ist richtig. Ein kostenloses upvote an die erste Person zu kommentieren, was hier passiert :) - Bill Weiss
Ich hoffte auf einen einfacheren Weg als awk, aber hoffe! = Realität manchmal ;-) Anscheinend würde "cut -f2 -d \ '" genau so gut funktionieren wie awk, und ein bisschen kürzer sein. - Tanktalus
Ja, Schnitt würde funktionieren, ich vergesse es immer. - Bill Weiss


Fügen Sie ein "Sudo" -Präfix hinzu zu ausgewählt Aliase UND Befehle aus deinem Inneren heraus ~/.bashrc so:

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

2
2017-10-02 09:21



Das geht nicht - da habe ich angefangen. Hast Du es versucht? - Tanktalus
Schönes Konzept. Meiner Ansicht nach alias sudo="sudo " ist jedoch einfacher. - trusktr


Wie schon ein paar Mal in ".bashrc":

alias sudo = 'sudo'

Der Grund dafür wird in 'man bash' und 'help alias' erklärt:

Alias: Alias ​​[-p] [Name [= Wert] ...]     Aliasnamen definieren oder anzeigen

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**

2
2018-06-22 15:35





Du willst so etwas:

(alias; echo "exec < /dev/tty") | sudo bash  -i

0
2017-09-01 22:41



Ich könnte mich irren, aber ISTR das bash -i (i = interaktiv) ist nur v4.0. Also auf einem älteren Server, der immer noch kam bash v3 läuft, würde dies höchstwahrscheinlich fehlschlagen. Aber beweis mich falsch, irgendjemand, geh voran;) - syntaxerror
@ syntaxfehler - Sie erinnern sich falsch. -i ist Bourne-Shell, siehe: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html - geocar
Wow, ich habe nicht erwartet, dass ich so bald eine Antwort für einen 6 Jahre alten Beitrag bekommen würde ... Warum, ja, ich hätte es vielleicht damit verwechselt #!/bin/bash -i nach dem Shebang, der anscheinend nicht derselbe ist (?). Um eine lange Geschichte kurz zu machen, mit history in einem bash Skript (und nicht in der "Live" -Befehlszeile) werden benötige die -i Option, die ich nicht auf einem Server mit "nur" arbeiten konnte bash v3 installiert Und das ist eine Tatsache. - syntaxerror