Come passare l'alias attraverso il sudo

Ho un alias che passa in alcuni parametri ad uno strumento che uso spesso. A volte corrono come me stesso, a volte sotto il sudo. Purtroppo, naturalmente, il sudo non riconosce l'alias.

Qualcuno ha un suggerimento su come passare l'alias attraverso?

In questo caso, ho un sacco di opzioni per il 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 

Ho bisogno di eseguirlo sotto 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 un modo piacevole e conciso per assicurarmi che il mio attuale pseudonimo pd fosse pienamente utilizzato (nel caso in cui ho bisogno di modificarlo più tardi), anche se alcuni dei miei tentativi non erano affatto concisi. Il mio ultimo resort è quello di metterlo in uno script di shell e metterlo da qualche parte che il sudo sarà in grado di trovare. Ma gli alias sono a volte soooo pratici, quindi è un'ultima scelta.

  • Estensione temporanea del timeout di sudo per la durata di uno script di installazione
  • la sicurezza del command Linux sudo?
  • Salva file dopo aver dimenticato di aprire come root / sudo vi
  • modi migliori per consentire a un gruppo di modificare alcuni file / etc
  • "L'utente non è nel file sudoers" nonostante l'utente appartenente alla ruota di gruppo
  • L'output del programma del pipe in un file protetto usando sudo
  • Limitare sudo a una sola directory ed è subdirectories dal file sudoers
  • Perché non posso eseguire ausearch (parte di auditd) in remoto su SSH?
  • 12 Solutions collect form web for “Come passare l'alias attraverso il sudo”

    Una soluzione molto elegante può essere trovata nel Archlinux-Wiki:

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

    funziona per passare tutti gli alias a sudo .

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

    Non sono certo chiaro su quello che stai cercando di fare. Posso vedere due modi:

    Il modo giusto

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

    Quindi l'esecuzione di pd ./mytool esegue il command di debug come root, ma conserva ancora i vantaggi del sudo (path di controllo, che non funziona da una shell root).

    Esempio:

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

    Il modo facile

    Aggiungere gli alias ai root di .bashrc e utilizzare sudo -i each volta che si desidera root.

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

    Basta avere due alias e utilizzare una variabile

    Non vedo la ragione per utilizzare awk o cut less che non sia sufficiente definire una sola alias di base per semplificare la modifica. Se questo è il caso, allora questo funziona:

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

    Ecco una function semplificata per creare coppie di alias come quelle 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 pd e spd plus ct e 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' 

    Vorrei poter segnare due risposte come "corrette". Combinando il modo giusto da Insyte , um, post insightful, con la soluzione awk (o tagliata) da Bill Weiss , ho trovato questo:

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

    Ora andrò a metterlo in una function di shell nella mia .bashrc o qualcosa e poi creo le versioni di "s" di tutti i miei alias che voglio correre come root.

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

      salias() { local ac 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 a tutto il command. Invece di:

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

    Faccio appena aggiungere gli s nella parte anteriore.

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

    E sono finita. Certo, il computer fa un po 'più lavoro, ma è per questo che è un computer. 🙂

    Grazie!

    Non sarebbe più facile semplicemente eliminare uno script che include le opzioni, quindi collocarlo da qualche parte in una delle cartelle che è il path per account e root fondamentali? Non avrebbe davvero bisogno di uno script.

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

    Questo è grezzo, 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}') abc" foo bar abc houdini@clanspum:~/ > fb foo bar houdini@clanspum:~/ > fb abc foo bar abc 

    Aggiungere un prefisso "sudo" a alias e comandi selezionati dall'interno del tuo ~/.bashrc 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; 

    Come inviato alcune volte, fai in '.bashrc':

    alias sudo = 'sudo'

    Il motivo per cui viene spiegato in 'uomo bash' e 'aiuto alias':

    alias: alias [-p] [nome [= valore] …] Definisce o visualizza 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.** 

    Vuoi qualcosa di simile:

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

    Non so se sia la cosa più saggia da fare in una scatola di produzione, ma in locale lo uso

     alias sudo="sudo -E" 

    L'opzione -E ( conserva ambiente ) sovrascrive l'opzione env_reset nei sudoers (5)). È disponibile solo quando il command corrispondente ha il tag SETENV oppure l'opzione setenv è impostata sudoer (5).

    Puoi aggiungere l'alias a root di .bashrc o semplicemente eseguire .bashrc attraverso sudo prima del tuo command?

     sudo (. ~yourlogin/.bashrc; pd ./mytool --some params) 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.