Por que o sudo ignora os aliases?

21

Estou executando o Ubuntu 10.04 e uso upstart para o gerenciamento de daemon. Meu aplicativo corporativo é executado como um daemon e deve ser executado como raiz devido a vários privilégios. Por exemplo:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc

Eu gostaria de introduzir um alias para abreviar esses comandos como algo como:

alias startapp='sudo start my-application-long-ID'

e executá-lo como startapp e isso funciona, mas eu preferiria não ter sudo no alias.

alias startapp='start my-application-long-ID'

não quando executado usando sudo startapp , retornando sudo: startapp: command not found .

No entanto, quando adicionei o alias:

alias sudo='sudo '

sudo startapp agora funciona, mas ainda estou curioso para saber por que o sudo ignora os aliases.

    
por amphibient 05.08.2014 / 18:20

4 respostas

33

Eu vejo as informações abaixo de aqui .

Ao usar sudo, use expansão de alias (caso contrário, o sudo ignorará seus aliases)

alias sudo='sudo '

O motivo pelo qual ele não funciona é explicado aqui .

Bash only checks the first word of a command for an alias, any words after that are not checked. That means in a command like sudo ll, only the first word (sudo) is checked by bash for an alias, ll is ignored. We can tell bash to check the next word after the alias (i.e sudo) by adding a space to the end of the alias value.

    
por 05.08.2014 / 18:25
5

Aliases e funções são definidos em um shell. Sudo é um programa externo. Portanto, o sudo não vê aliases, funções ou built-in de shell, apenas comandos externos.

Aliases são nomes de comandos alternativos, então shells só os expandem em posição de comando, não quando são argumentos para comandos. O Zsh suporta aliases globais, que são expandidos em qualquer lugar na linha de comando, e usam melhor com parcimônia, pois há o risco de expandi-los acidentalmente, mesmo em contextos em que o alias não faz sentido.

Você pode dizer ao sudo para invocar um shell: sudo sh -c '…shell command here…' . Seus aliases usuais não estarão disponíveis dentro desse comando shell, já que eles são normalmente armazenados em um arquivo como ~/.bashrc ou ~/.zshrc , que é lido apenas por shells interativos.

alias sudo='sudo ' , como proposto por Ramesh , faz com que o shell expanda aliases após sudo .

    
por 06.08.2014 / 01:52
0

Eu apenas dei uma resposta alternativa aqui sem redefinindo sudo com um alias.

No seu caso, seria:

type -a startapp | grep -o -P "(?<=\').*(?=')" | xargs sudo 

Tudo em uma linha, sem shells extras, sem redefinições de alias. ; -)

    
por 15.02.2015 / 21:12
0

Uma solução para usuários zsh

No bash e no zsh, finalizar um alias com um espaço fará com que o shell aliasse a próxima palavra. Isso permite algo como o seguinte para alias expandir myalias

alias 'sudo=sudo '
sudo myalias

Infelizmente, isso desmorona quando você tem mais de uma palavra em seu alias (como sudo -u someone . No entanto, você pode abusar do recurso zsh "aliases globais" para expandir manualmente os aliases em qualquer lugar do comando.

alias -g '$= '

Isso cria um alias global chamado $ (você pode usar qualquer palavra que quiser) que termina em um espaço. Isso faz com que o zsh expanda a próxima palavra como um alias de comando regular. Como o alias se expande para espaços em branco, ele não será tratado como um argumento. Isso permite que o seguinte funcione.

% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo

Você pode até usar $ várias vezes em uma linha de comando se tiver um aninhamento de comando complicado. Eu achei isso útil o suficiente para que ele tenha um lugar permanente no meu zshrc, entretanto o alias é simples o suficiente para definir quando você precisa usá-lo.

    
por 27.03.2018 / 16:15