So übergeben Sie einen Alias ​​über sudo

32

Ich habe einen Alias, der einige Parameter an ein Tool weitergibt, das ich oft benutze. Manchmal laufe ich als ich selbst, manchmal unter sudo. Leider erkennt sudo den Alias ​​natürlich nicht.

Hat jemand einen Tipp, wie man den Alias ​​durchgibt?

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, anstatt Folgendes auszuführen:

pd ./mytool --some params

Ich muss es unter sudo ausführen. 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 hatte gehofft, dass mein aktueller pd-alias vollständig genutzt wird (falls ich ihn später anpassen muss), obwohl einige meiner Versuche überhaupt nicht präzise waren. Mein letzter Ausweg besteht darin, es in ein Shell-Skript zu schreiben und dieses irgendwo zu platzieren, wo Sudo es finden kann. Aber Aliase sind manchmal soooo praktisch, dass es ein letzter Ausweg ist.

Tanktalus
quelle

Antworten:

50

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

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

Übergibt alle Aliase an sudo .

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

Slizzered
quelle
16
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
1
Dies sollte wirklich die akzeptierte Antwort sein.
Adrian Frühwirth
Es ist eine Schande, dass dies für Funktionen nicht funktioniert.
Ciro Santilli
2
Hinweis: Angenommen , Sie brauchen eine passieren Option zu sudo, wieder während dieses halten will sudo-passthrough Trick zugleich. Auch dies ist möglich: Um Optionen erneut zu verwenden, verwenden Sie \sudo. Der Backslash überschreibt den Alias. (Viele scheinen das nicht zu wissen). Auf diese Weise können Sie ( Gefahr! ) Entfernen sogar Dateien ohne jede Warnung, die zwingende alias rm='rm -i'allgemein angegeben in .bash-aliases, einfach durch Eingabe \rm file-to-delete.
Syntaxfehler
11

Mir ist nicht ganz klar, was Sie versuchen. Ich kann zwei Wege sehen:

Der richtige Weg

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

Dann ausführen pd ./mytoolWenn Sie wird Ihr Debugging-Befehl als root ausgeführt, die Vorteile von sudo bleiben jedoch erhalten (Audit-Trail, nicht aus einer Root-Shell heraus).

Beispiel:

insyte $ alias sid = 'sudo id'
insyte $ sid
uid = 0 (root) gid = 0 (root) groups = 0 (root)

Der einfache Weg

Fügen Sie die Aliase zu root hinzu .bashrcund verwenden sudo -iSie sie, wenn Sie sudo zu root machen.

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root # exit
Ausfahrt
insyte $ sudo -i
root # fb
Foo Bar
Insyte
quelle
4

Habe einfach zwei Aliase und benutze eine Variable

Ich sehe keinen Grund für die Verwendung awkoder es cutsei denn, der Kernalias wurde nur einmal definiert, um das Ändern zu vereinfachen. 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 vereinfachende Funktion, um Alias-Paare wie das oben stehende 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 pdund spdplus ctund 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'
Bis auf weiteres angehalten.
quelle
4

Ich wünschte, ich könnte zwei Antworten als "richtig" markieren. Wenn ich den richtigen Weg aus Insytes , ähm, aufschlussreichem Beitrag mit der awk (oder cut) -Lösung von Bill Weiss kombiniere , habe ich Folgendes gefunden :

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

Jetzt füge ich dies einfach in eine Shell-Funktion in meinem .bashrc oder so ein und erstelle dann "s" -Versionen aller meiner Aliase, die ich als root ausführen möchte.

Update : leichte Modifikation der simplen Funktion von Dennis Williamson , um die Bedienung zu vereinfachen:

 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 heißt, ich muss nur "s" vor den gesamten Befehl setzen. Anstatt:

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

Ich füge gerade das s in der Front hinzu.

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

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

Vielen Dank!

Tanktalus
quelle
Sie können (oder sollten) in der Lage sein, Dinge als akzeptiert zu markieren, was einer korrekten Kennzeichnung ähnelt :)
Bill Weiss
Richtig - ich möchte zwei Antworten als richtig markieren :-P
Tanktalus
3
Warum nicht Slizzereds Antwort? alias sudo="sudo "funktioniert perfekt.
Trusktr
3

Wäre es nicht einfacher, ein Skript, das Ihre Optionen enthält, einfach zu hacken und dann in einem der Ordner abzulegen, in denen sich der Pfad für das reguläre Konto und den Stammordner befindet? Es würde wirklich nicht viel von einem Drehbuch brauchen.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*
Zoredache
quelle
Es muss eigentlich "$ @" statt "$ *" sein, und das ist ein Teil des Grundes, warum ich im Allgemeinen versuche, es zu vermeiden. ;-) Es funktioniert, es verschwendet nur eine Menge Speicherplatz im Verhältnis zu dem, was es enthält.
Tanktalus
3

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
Bill Weiss
quelle
Ich habe hier eine unvollständige Lösung eingefügt und sie dann bearbeitet, um sie zu beheben. Die aktuelle ist richtig. Ein kostenloses Upvote für die erste Person, die kommentiert, was hier los ist :)
Bill Weiss
Ich hatte auf einen einfacheren Weg gehofft als awk, aber hoffe! = Realität manchmal ;-) Anscheinend würde "cut -f2 -d \ '" genauso gut funktionieren wie awk und das kleine bisschen kürzer sein.
Tanktalus
Ja, schneiden würde funktionieren, ich vergesse es immer.
Bill Weiss
3

Fügen Sie ein "sudo" -Präfix zu ausgewählten Aliasen und Befehlen in Ihrem Namen hinzu ~/.bashrc:

#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;

quelle
Das geht nicht - da habe ich angefangen. Hast Du es versucht?
Tanktalus
Nettes Konzept. Ich denke alias sudo="sudo "ist aber einfacher.
Trusktr
3

Wie ein paar Mal gepostet, mach in '.bashrc':

alias sudo = 'sudo'

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

alias: alias [-p] [name [= wert] ...] Definiert oder zeigt Aliase an.

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.**
Sixerjman
quelle
1

Sie möchten so etwas:

(alias; echo "exec < /dev/tty") | sudo bash  -i
Geocar
quelle
Ich könnte mich irren, aber ISTR das bash -i(i = interaktiv) ist nur v4.0. Auf einem älteren Server, auf dem noch bashv3 ausgeführt wird, würde dies höchstwahrscheinlich fehlschlagen. Aber beweise, dass ich mich geirrt habe;)
Syntaxfehler
@syntaxerror - Du erinnerst dich falsch. -iist Bourne Shell, siehe: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
Geocar
Wow, ich hatte nicht erwartet, so bald eine Antwort auf einen über 6-jährigen Beitrag zu erhalten ... Warum ja, ich hätte es #!/bin/bash -inach dem Schebang vielleicht verwechselt , was anscheinend nicht dasselbe ist (?). Um es kurz zu machen, für die Verwendung historyin einem bashSkript (und nicht in der "Live" -Befehlszeile) ist die -iOption erforderlich , die ich auf einem Server mit "nur" bashv3 nicht zum Arbeiten bringen konnte . Und das ist eine Tatsache.
Syntaxfehler
1

Ich weiß nicht, ob es am klügsten ist, eine Produktionsbox zu verwenden, aber lokal verwende ich sie

alias sudo="sudo -E"

Die Option -E ( Umgebung beibehalten ) überschreibt die Option env_reset in sudoers (5). Es ist nur verfügbar, wenn entweder der übereinstimmende Befehl das SETENV-Tag hat oder die Option setenv in sudoers (5) festgelegt ist.

Eddie B
quelle
-1

Können Sie den Alias ​​zum .bashrc von root hinzufügen oder einfach .bashrc über sudo ausführen, bevor Sie den Befehl ausführen?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)
Robert Swisher
quelle
1
Ähm, das hat auch fast nicht geklappt. Es ist eigentlich ziemlich nah an einigen Dingen, die ich oben ausprobiert habe, aber weiter von der tatsächlichen Shell / Sudo-Syntax entfernt.
Tanktalus