Como passar o alias pelo sudo

30

Eu tenho um alias que passa em alguns parâmetros para uma ferramenta que eu uso com freqüência. Às vezes eu corro como eu mesmo, às vezes sob o sudo. Infelizmente, é claro, o sudo não reconhece o pseudônimo.

Alguém tem alguma dica de como passar o pseudônimo?

Nesse caso, tenho várias opções para o perl quando estou depurando:

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

Às vezes, eu preciso depurar minhas ferramentas como root, então, em vez de executar:

pd ./mytool --some params

Eu preciso rodar sob o sudo. Eu tentei de várias maneiras:

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

Eu estava esperando por uma maneira agradável e concisa para garantir que meu alias atual de pd fosse totalmente usado (no caso de eu precisar ajustá-lo mais tarde), embora algumas das minhas tentativas não fossem concisas. Meu último recurso é colocá-lo em um shell script e colocá-lo em algum lugar que o sudo possa encontrar. Mas aliases são muito úteis às vezes, então é um último recurso.

    
por Tanktalus 01.09.2009 / 22:44

12 respostas

3

Eu gostaria de poder marcar duas respostas como "corretas". Combinando o caminho certo com Insyte , um, perspicaz post, com a solução awk (ou corte) de Bill Weiss , eu descobri isso:

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

Agora eu vou apenas colocar isso em uma função shell no meu .bashrc ou algo assim, e então criar versões "s" de todos os meus aliases que eu desejo executar como root.

Atualização : pequena modificação da função simplista do Dennis Williamson para torná-lo um pouco mais fácil de usar:

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

Isso significa que eu só tenho que colocar "s" na frente de todo o comando. Em vez de:

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

Eu apenas adiciono os s na frente.

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

E eu terminei. Claro, o computador faz um pouco mais de trabalho, mas é para isso que serve um computador. : -)

Obrigado!

    
por 02.09.2009 / 00:55
47

Uma solução elegante very pode ser encontrada no Archlinux-Wiki:

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

funciona para passar todos os aliases para sudo .

Fonte: link

    
por 07.09.2010 / 23:58
10

Não estou bem claro sobre o que você está tentando fazer. Eu posso ver duas maneiras:

O caminho certo

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

Em seguida, executar pd ./mytool executará seu comando de depuração como root, mas ainda preservará os benefícios do sudo (trilha de auditoria, não operando a partir de um shell raiz).

Exemplo:

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

A maneira fácil

Adicione os aliases ao root .bashrc e use sudo -i sempre que você sudo para root.

root# echo 'alias fb="echo foo bar"' >> /root/.bashrc
root# exit
exit
insyte$ sudo -i
root# fb
foo bar
    
por 02.09.2009 / 00:36
3

Basta ter dois aliases e usar uma variável

Não vejo o motivo para usar awk ou cut , a menos que seja para ter apenas o alias principal definido uma vez para facilitar a modificação. Se for esse o caso, então isso funciona:

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

Aqui está uma função simplista para criar pares de aliases como o acima:

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

Para usar:

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

Agora você tem 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'
    
por 02.09.2009 / 07:32
3

de link

alias sudo='sudo '
    
por 08.03.2011 / 22:25
2

Não seria mais fácil simplesmente criar um script que incluísse suas opções e, em seguida, colocá-lo em algum lugar em uma das pastas que é o caminho para a conta e o root regulares? Realmente não precisaria de muito script.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*
    
por 01.09.2009 / 23:17
2

Isso é difícil, mas funciona aqui:

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
    
por 01.09.2009 / 23:58
2

Adicione um prefixo "sudo" aos aliases e comandos selecionados de dentro do seu ~/.bashrc da seguinte forma:

#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;
    
por 02.10.2009 / 11:21
2

Como postado algumas vezes, faça em '.bashrc':

alias sudo = 'sudo'

A razão pela qual é explicada em 'man bash' e 'help alias':

alias: alias [-p] [nome [= valor] ...]     Definir ou exibir aliases.

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.**
    
por 22.06.2011 / 17:35
0

Você quer algo assim:

(alias; echo "exec < /dev/tty") | sudo bash  -i
    
por 02.09.2009 / 00:41
0

Eu não sei se é a coisa mais sensata a se fazer em uma caixa de produção, mas localmente eu uso

alias sudo="sudo -E"

The -E (preserve environment) option will override the env_reset option in sudoers(5)). It is only available when either the matching command has the SETENV tag or the setenv option is set in sudoers(5).

    
por 04.06.2012 / 06:55
-1

Você pode adicionar o alias ao .bashrc do root ou apenas executar o .bashrc através do sudo antes do seu comando?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)
    
por 01.09.2009 / 23:07