Hoje eu estava brincando com aliases e notei que os aliases não parecem estar disponíveis enquanto estiver 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 enquanto estiver usando sudo
?
/root/.bashrc
não é lido ao executar um comando através do sudo.sudo -i
?Respostas:
Adicione a seguinte linha ao seu
~/.bashrc
:No manual do bash :
(Ênfase minha).
O Bash verifica apenas a primeira palavra de um comando em busca de 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 ao bash para verificar a próxima palavra após o alias (iesudo
), adicionando um espaço ao final do valor do alias.fonte
sudo -H ll
?Eu escrevi uma função Bash para ela que sombreia
sudo
.Ele verifica se eu tenho um alias para o comando fornecido e executa o comando alias em vez do literal
sudo
nesse caso.Aqui está minha função como one-liner:
Ou bem formatado:
Você pode anexá-lo ao seu
.bashrc
arquivo, não se esqueça de fonte ou reinicie a sessão do terminal posteriormente para aplicar as alterações.fonte
Os aliases são específicos do usuário - você precisa defini-los em
/root/.bashrc
fonte
sudo -s
ousudo -i
(e única , se executado por si só para obter uma shell de root, não com ossudo -s command...
ousudo -i command...
formas) ousudo bash
ousudo su
ou a situação onde você ativou logins raiz e tem um shell raiz dessa maneira. Quando um usuário não raiz executa asudo command...
partir de seu próprio shell, a expansão do alias é feita por seu próprio shell não raiz.sudo
não expande aliases; portanto, conforme aplicada à situação descrita na pergunta , essa resposta está incorreta.A resposta do @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 umalias
comando.Aqui está minha proposta para aqueles a quem possa interessar:
Solução
Exemplo
No caso do
ll
comandoExplicação
quando você tem um alias (como:),
ll
o comandotype -a
retorna a expressão alias:com
grep
você seleciona o texto entre o acento `e apóstrofo 'nesse casols -l
E
xargs
executa o texto selecionadols -l
como parâmetro desudo
.Sim, um pouco mais, mas completamente limpo ;-) Não há necessidade de redefinir
sudo
como alias.fonte
alias
built-in, já que sua saída é mais limpa.alias ll
saídasalias ll='ls -ahlF'
.alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo
.sudo -i
primeiro, executar o comando alias, mas fazê-lo imediatamente. Ter um comando tão complexo derrota isso. Você poderia fazer o primeiro e ser muito mais rápido.Eu tenho outra solução interessante, que adiciona um pouco de confiança também:
Use a conclusão do bash para substituir automaticamente as palavras por trás
sudo
por seus aliases ao pressionar tab.Salve isso como
/etc/bash_completion.d/sudo-alias.bashcomp
e ele deve ser carregado automaticamente na inicialização interativa do shell:Em seguida, faça login em um novo terminal e você deve estar pronto.
fonte
compgen -a
sudo ll
), pressiona [TAB] e o script encontrall
na lista de atribuições de alias, corta o que é atribuído a ele e o insere. (Então você deseja obter por exemplosudo ls -lahvF --color=auto --time-style=long-iso
.)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 deve ser bastante semelhante ao Ubuntu.Quando você é root, ele
.profile
é executado a partir do diretório inicial. Se você não souber qual é o diretório inicial no diretório raiz, poderá verificar com:Como você pode ver, o lar de
root
é/root/
. Verifique seu conteúdo:Deve haver um
.profile
arquivo. Abra o arquivo e adicione as seguintes linhas:Basicamente, o que esse script bash faz é procurar um arquivo chamado
.bash_aliases
. Se os arquivos estiverem presentes, ele executará o arquivo.Salve o
.profile
arquivo e crie seus aliases em.bash_aliases
. Se você já tiver o arquivo de aliases pronto, copie o arquivo para este localReinicie o terminal e você está pronto!
fonte
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 tudo mais) no
#
prompt, use:Onde "$ PWD" é expandido automaticamente para "/ home / YOUR_USER_NAME"
fonte
@ 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 raiz separado. Na verdade, eu o tornaria um arquivo real
/root
, um link direto para ele no diretório inicial do usuário (por exemplo,.bashrc_root
) e o originaria do.bashrc
arquivo do usuário . Se, posteriormente, essa conta de usuário privilegiada não estiver mais presente, o.bashrc
arquivo raiz ainda estará disponível para outros usuários.fonte