Come passare alias tramite sudo


32

Ho un alias che passa alcuni parametri a uno strumento che uso spesso. A volte corro come me stesso, a volte sotto sudo. Sfortunatamente, ovviamente, sudo non riconosce l'alias.

Qualcuno ha un suggerimento su come passare l'alias?

In questo caso, ho un sacco di opzioni per Perl durante il debug:

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

A volte, devo eseguire il debug dei miei strumenti come root, quindi, invece di eseguire:

pd ./mytool --some params

Devo eseguirlo su sudo. Ho provato molti modi:

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'"

Speravo in un modo simpatico e conciso per garantire che il mio attuale pd alias fosse pienamente utilizzato (nel caso dovessi modificarlo in seguito), anche se alcuni dei miei tentativi non erano affatto concisi. La mia ultima risorsa è metterlo in uno script di shell e metterlo da qualche parte che sudo sarà in grado di trovare. Ma a volte gli alias sono davvero utili, quindi è l'ultima risorsa.

Risposte:


50

Una soluzione molto elegante è disponibile in Archlinux-Wiki:

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

funziona per passare tutti gli alias a sudo.

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


16
Questo è un grande trucco! Per i curiosi, la spiegazione della sezione alias nella manpage di bash:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis,

1
Questa dovrebbe davvero essere la risposta accettata.
Adrian Frühwirth,

È un peccato che questo non funzioni per le funzioni.
Ciro Santilli 9 改造 中心 法轮功 六四 事件

2
Nota: Supponendo si ha bisogno di passare un 'opzione di sudonuovo, pur volendo mantenere quel sudotrick -passthrough allo stesso tempo. Anche questo può essere fatto: per usare nuovamente le opzioni, usare \sudo. La barra rovesciata sostituirà l'alias. (Molti sembrano non saperlo). In questo modo, puoi ( pericolo! ) Anche rimuovere i file senza alcun preavviso, sovrascrivendo quello alias rm='rm -i'comunemente specificato .bash-aliases, semplicemente digitando \rm file-to-delete.
syntaxerror,

11

Non sono molto chiaro su cosa stai cercando di fare. Posso vedere due modi:

Il modo giusto

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

Quindi l'esecuzione pd ./mytooleseguirà il comando di debug come root ma manterrà comunque i vantaggi di sudo (audit trail, non operante da una shell root).

Esempio:

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

Il modo più semplice

Aggiungi gli alias ai root .bashrce utilizzali sudo -iogni volta che esegui sudo su root.

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

4

Basta avere due alias e usare una variabile

Non vedo il motivo dell'utilizzo awko, a cutmeno che non sia di avere definito l'alias di base una sola volta per rendere più semplice la modifica. In tal caso, allora funziona:

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

Ecco una funzione semplicistica per creare coppie alias come quella sopra:

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

Usare:

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

Ora hai pde spdpiù cte 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'

4

Vorrei poter contrassegnare due risposte come "corrette". Combinando la strada giusta dall'insight , insightful post di Insyte , con la soluzione awk (o tagliata) di Bill Weiss , ho trovato questo:

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

Ora andrò semplicemente a metterlo in una funzione shell nel mio .bashrc o qualcosa del genere, quindi creerò le versioni "s" di tutti i miei alias che desidero eseguire come root.

Aggiornamento : leggera modifica della funzione semplicistica di Dennis Williamson per renderlo un po 'più facile da usare:

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

Questo significa che devo solo mettere "s" davanti all'intero comando. Invece di:

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

Aggiungo solo la s nella parte anteriore.

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

E ho finito. Certo, il computer fa un po 'più di lavoro, ma è a questo che serve un computer. :-)

Grazie!


Puoi (o essere in grado di) contrassegnare le cose come accettate, il che è un po 'come contrassegnarle come corrette :)
Bill Weiss,

Bene - Voglio contrassegnare due risposte come corrette :-P
Tanktalus,

3
Perché non la risposta di Slizzered? alias sudo="sudo "funziona perfettamente.
trusktr,


3

Non sarebbe più semplice semplicemente eliminare uno script che include le tue opzioni, quindi posizionarlo da qualche parte in una delle cartelle che è il percorso per account e root regolari? Davvero non ci vorrebbe molto di una sceneggiatura.

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

In realtà deve essere "$ @" anziché $ *, e questo è uno dei motivi per cui generalmente cerco di evitarlo. ;-) Funziona, spreca solo un sacco di spazio su disco rispetto a ciò che contiene.
Tanktalus,

3

Questo è approssimativo, ma funziona qui:

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

Ho incollato una soluzione incompleta qui, quindi modificato per risolvere. Quello attuale è giusto. Un voto gratuito alla prima persona che commenta spiegando cosa sta succedendo qui :)
Bill Weiss,

Speravo in un modo più semplice di awk, ma spero! = Realtà a volte ;-) Apparentemente, "cut -f2 -d \ '" avrebbe funzionato altrettanto bene che awk, ed essere un po' più breve.
Tanktalus,

Sì, il taglio avrebbe funzionato, me ne dimentico sempre.
Bill Weiss,

3

Aggiungi un prefisso "sudo" agli alias e ai comandi selezionati dal tuo ~/.bashrclike così:

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

Non funziona, ecco da dove ho iniziato. Hai provato?
Tanktalus,

Bel concetto. Penso che alias sudo="sudo "sia più facile però.
trusktr,

3

Come pubblicato più volte, fai in '.bashrc':

alias sudo = 'sudo'

Il motivo per cui è spiegato in "man bash" e "help alias":

alias: alias [-p] [nome [= valore] ...] Definisce o visualizza gli alias.

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.**

1

Vuoi qualcosa del genere:

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

Potrei sbagliarmi, ma ISTR che bash -i(i = interattivo) è solo v4.0. Quindi su un server più vecchio che ha ancora la bashv3 in esecuzione, molto probabilmente fallirebbe. Ma dimostrami che sbaglio, chiunque, vai avanti;)
syntaxerror

@syntaxerror - Ti ricordi di aver sbagliato. -iè Bourne shell, vedi: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar

Wow, non mi aspettavo di ricevere una risposta così presto per un post di 6 anni + anni ... Perché sì, avrei potuto confonderlo con #!/bin/bash -idopo lo shebang, che apparentemente non è lo stesso (?). Per tagliare una lunga storia breve, utilizzando historyin uno bashscritto (e non sulla riga di comando "live") si richiede l' -iopzione, che non sono riuscito a far funzionare su un server con "solo" bashv3 installato. E questo è un dato di fatto.
syntaxerror,

1

Non so se sia la cosa più saggia da fare su una scatola di produzione, ma localmente uso

alias sudo="sudo -E"

L' opzione -E ( preserva l'ambiente ) sovrascriverà l'opzione env_reset in sudoers (5)). È disponibile solo quando il comando corrispondente ha il tag SETENV o l'opzione setenv è impostata su sudoers (5).


-1

Puoi aggiungere l'alias al .bashrc di root o semplicemente eseguire .bashrc tramite sudo prima del tuo comando?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
Ehm, neanche questo ha quasi funzionato. In realtà è abbastanza vicino ad alcune delle cose che ho provato sopra, ma è più lontano dalla vera sintassi shell / sudo.
Tanktalus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.