Como passar o alias pelo sudo


32

Eu tenho um alias que passa em alguns parâmetros para uma ferramenta que eu uso frequentemente. Às vezes eu corro como eu, às vezes no sudo. Infelizmente, é claro, o sudo não reconhece o apelido.

Alguém tem uma dica de como passar o alias?

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

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

Às vezes, tenho que depurar minhas ferramentas como root, portanto, em vez de executar:

pd ./mytool --some params

Eu preciso executá-lo no 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 esperava uma maneira agradável e concisa de garantir que meu alias de pd atual fosse totalmente usado (caso precise ajustá-lo mais tarde), embora algumas de minhas tentativas não fossem concisas. Meu último recurso é colocá-lo em um script shell e colocá-lo em algum lugar que o sudo possa encontrar. Mas, às vezes, aliases são muuuuito úteis, por isso é um último recurso.

Respostas:


50

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

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

trabalha para passar todos os aliases para sudo.

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


16
Este é um ótimo truque! Para os curiosos, a explicação da seção de alias na página de manual do bash:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis

1
Esta deve realmente ser a resposta aceita.
Adrian Frühwirth

É uma pena que isso não funcione para funções.
Ciro Santilli # 9/15

2
Nota: Supondo que você precisa fazer para passar uma opção de sudonovo, enquanto querendo manter esse sudotruque -passthrough ao mesmo tempo. Mesmo isso pode ser feito: para usar as opções novamente, use \sudo. A barra invertida substituirá o alias. (Muitos parecem não saber disso). Dessa forma, você pode ( perigo! ) Até remover arquivos sem nenhum aviso, substituindo o alias rm='rm -i'normalmente especificado em .bash-aliases, simplesmente digitando \rm file-to-delete.
syntaxerror 29/01

11

Não sou muito 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'

A execução pd ./mytoolexecutará seu comando de depuração como root, mas ainda preservará os benefícios do sudo (trilha de auditoria, não operando com um shell raiz).

Exemplo:

insyte $ alias sid = 'ID do sudo'
insyte $ sid
uid = 0 (raiz) gid = 0 (raiz) grupos = 0 (raiz)

O caminho fácil

Adicione os aliases ao root .bashrce use sudo -isempre que você sudo fizer root.

root # echo 'alias fb = "barra de eco de eco"' >> /root/.bashrc
raiz # saída
Saída
insyte $ sudo -i
raiz # fb
foo bar

4

Apenas tenha dois apelidos e use uma variável

Não vejo o motivo do uso awkou a cutmenos que ele tenha apenas o alias principal definido uma vez para facilitar a modificação. Se for esse o caso, 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 alias como o acima:

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

Usar:

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

Agora você tem pde spdmais 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

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

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

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

Atualização : pequena modificação da função simplista de Dennis Williamson para facilitar um pouco o uso:

 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 apenas tenho que colocar "s" na frente de todo o comando. Ao invés 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 trabalha um pouco mais, mas é para isso que serve um computador. :-)

Obrigado!


Você pode (ou deve ser capaz de) marcar as coisas como aceite, que é tipo de como marcá-los corrigir :)
Bill Weiss

Direito - Quero marcar duas respostas como :-P correta
Tanktalus

3
Por que não a resposta de Slizzered? alias sudo="sudo "funciona perfeito.
trusktr


3

Não seria mais fácil simplesmente hackear um script que inclui suas opções e colocá-lo em algum lugar de uma das pastas que é o caminho para a conta e a raiz comuns? Realmente não seria preciso muito script.

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

Na verdade, ele deve ser "$ @" em vez de $ *, e essa é uma das razões pelas quais geralmente tento evitá-lo. ;-) Funciona, apenas gasta muito espaço em disco em relação ao que contém.
Tanktalus 01/09/09

3

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

Colei uma solução incompleta aqui e editei para corrigir. O atual está certo. A upvote livre para a primeira pessoa a comentar explicar o que está acontecendo aqui :)
Bill Weiss

Eu esperava uma maneira mais simples do que o awk, mas a esperança! = Realidade às vezes ;-) Aparentemente, "cut -f2 -d \ '" funcionaria tão bem quanto o awk, e seria um pouco mais curto.
Tanktalus 01/09/09

Sim, o corte funcionaria, eu sempre esqueço disso.
Bill Weiss

3

Adicione um prefixo "sudo" aos aliases AND comandos selecionados de dentro da sua ~/.bashrcmaneira:

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

Isso não funciona - foi daí que comecei. Você tentou?
Tanktalus

Bom conceito. Eu acho que alias sudo="sudo "é mais fácil.
trusktr

3

Conforme publicado algumas vezes, faça em '.bashrc':

alias sudo = 'sudo'

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

alias: alias [-p] [name [= value] ...] Defina ou exiba 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.**

1

Você quer algo assim:

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

Posso estar errado, mas o ISTR que bash -i(i = interativo) é apenas a v4.0. Portanto, em um servidor mais antigo que ainda bashexecutava a v3, isso provavelmente falharia. Mas me provar que estou errado, qualquer um, vá em frente;)
SyntaxError

@ syntaxerror - Você se lembra errado. -ié shell Bourne, consulte: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar

Uau, não esperava receber uma resposta tão cedo para um post de 6 anos de idade ... Por que sim, eu posso ter confundido isso #!/bin/bash -idepois do shebang, que aparentemente não é o mesmo (?). Para cortar uma longa história curta, usando historyem um bashroteiro (e não na linha de comando "ao vivo") vai exigir a -iopção, que eu era incapaz de começar a trabalhar em um servidor com "apenas" bashv3 instalado. E isso é um fato.
syntaxerror 29/01

1

Não sei se é a coisa mais sábia a se fazer em uma caixa de produção, mas localmente eu uso

alias sudo="sudo -E"

A opção -E ( preservar ambiente ) substituirá a opção env_reset em sudoers (5)). Está disponível apenas quando o comando correspondente possui a marca SETENV ou a opção setenv está definida em sudoers (5).


-1

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

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

1
Hum, isso nem quase funcionou também. Na verdade, é bastante parecido com algumas das coisas que tentei acima, mas está mais distante da sintaxe shell / sudo real.
Tanktalus 01/09/09
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.