Aliases não disponíveis ao usar o sudo

152

Eu estava brincando com os aliases hoje e percebi que os aliases não parecem estar disponíveis usando sudo :

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

Existe alguma razão pela qual você não pode usar aliases usando sudo ?

    
por kemra102 17.01.2011 / 23:47

8 respostas

237

Adicione a seguinte linha ao seu ~/.bashrc :

alias sudo='sudo '

Do manual do bash :

Aliases allow a string to be substituted for a word when it is used as the first word of a simple command. The shell maintains a list of aliases that may be set and unset with the alias and unalias builtin commands.

The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. The characters ‘/’, ‘$’, ‘'’, ‘=’ and any of the shell metacharacters or quoting characters listed above may not appear in an alias name. The replacement text may contain any valid shell input, including shell metacharacters. The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to "ls -F", for instance, and Bash does not try to recursively expand the replacement text. If the last character of the alias value is a space or tab character, then the next command word following the alias is also checked for alias expansion.

(Ênfase minha).
Bash apenas verifica a primeira palavra de um comando para um alias, quaisquer palavras depois disso não são verificadas. Isso significa que em um comando como sudo ll , apenas a primeira palavra ( sudo ) é verificada pelo bash para um alias, ll é ignorada. Podemos dizer bash para verificar a próxima palavra após o alias (ou seja, sudo ), adicionando um espaço para o final do valor do alias.

    
por Isaiah 18.01.2011 / 00:08
5

Eu escrevi uma função de Bash para ela que sombreia sudo .

Ele verifica se eu tenho um alias para o comando especificado e executa o comando de aliases em vez do literal com sudo nesse caso.

Aqui está a minha função como one-liner:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*'(.*).$//') "${@:2}" ; else command sudo $@ ; fi }

Ou bem formatado:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*'(.*).$//') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

Você pode anexá-lo ao seu arquivo .bashrc , não se esqueça de procurá-lo ou reiniciar sua sessão de terminal para aplicar as alterações.

    
por Byte Commander 27.09.2016 / 11:19
3

Os aliases são específicos do usuário - você precisa defini-los em /root/.bashrc

    
por Ragnar123 18.01.2011 / 00:01
3

A resposta @Alvins é a mais curta. Sem dúvida! : -)

No entanto, pensei em uma solução de linha de comando para executar um comando com alias no sudo , onde não há necessidade de redefinir sudo com um comando alias .

Aqui está minha proposta para aqueles a quem possa interessar:

Solução

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\').*(?=')" | xargs sudo

Exemplo

No caso do comando ll

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

Explicação

quando você tem um alias (como: ll ), o comando type -a retorna a expressão com alias:

$type -a ll
ll is aliased to 'ls -l'

com grep , você seleciona o texto entre o acento 'e o apóstrofo' nesse caso ls -l

E xargs executa o texto selecionado ls -l como parâmetro de sudo .

Sim, um pouco mais longo, mas completamente limpo ;-) Não é necessário redefinir sudo como alias.

    
por loved.by.Jesus 15.02.2015 / 20:37
1

Eu tenho outra boa solução que adiciona um pouco de confiança também:

Use o complemento bash para substituir automaticamente as palavras por trás de sudo por seus aliases ao pressionar a guia.

Salve isso como /etc/bash_completion.d/sudo-alias.bashcomp e ele deve ser carregado automaticamente na inicialização do shell interativo:

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$//" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

Em seguida, faça login em um novo terminal e você deve estar pronto.

    
por Evi1M4chine 08.09.2017 / 18:09
0

Eu tenho uma solução diferente, na qual você não precisa adicionar sudo como um alias. Eu corro o Linux Mint 17.3, mas ele deve ser bem parecido com o Ubuntu.

Quando você é root, o .profile é executado em seu diretório inicial. Se você não sabe o que é o diretório home em root, então você pode verificar com:

sudo su
echo $HOME

Como você pode ver, a casa de root é /root/ . Verifique o seu conteúdo:

cd $HOME
ls -al

Deve haver um arquivo .profile . Abra o arquivo e adicione as seguintes linhas:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

Basicamente, o que esse script bash faz é verificar um arquivo chamado .bash_aliases . Se os arquivos estiverem presentes, ele executa o arquivo.

Salve o arquivo .profile e crie seus aliases em .bash_aliases . Se você já tiver o arquivo de aliases pronto, copie o arquivo para esse local

Reinicie o terminal e você está pronto!

    
por Karthik Ramakrishnan 10.06.2016 / 23:06
0

A resposta mais votada é ótima. No entanto, se você digitar sudo -i e elevar para um prompt do sudo ( # ), não terá os aliases que deseja usar.

Para utilizar seus aliases (e todo o resto) no prompt # , use:

sudo cp "$PWD"/.bashrc /root/.bashrc

Onde "$ PWD" é expandido automaticamente para "/ home / YOUR_USER_NAME"

    
por WinEunuuchs2Unix 25.11.2016 / 03:50
0

@ WinEunuuchs2Unix: $PWD expande para o "diretório de trabalho atual". Eu acho que você quer $HOME .

Além disso, na maioria das situações, provavelmente é melhor ter um arquivo .bashrc de raiz separado. Na verdade, eu transformaria um arquivo real em /root , criaria um link para ele no diretório inicial do usuário (por exemplo, .bashrc_root ) e o originaria do arquivo .bashrc do usuário. Se, em algum momento posterior, essa conta de usuário privilegiada não estiver mais presente, o arquivo .bashrc da raiz ainda estará disponível para outros usuários.

    
por Shaun Griffith 06.10.2018 / 13:04

Tags