TL; DR: você pode usar sudo -ipara executar uma função definida /root/.bashrc(mas não um alias) e também ter acesso às variáveis exportadas desse arquivo:
argumentos de comando sudo -i
Porém, os aliases não funcionam lá, mas você pode convertê-los facilmente em funções, se desejar disponibilizá-los sudo -i.
Leia para análise completa e mais detalhes.
Existem alguns problemas aqui, alguns sobre o funcionamento do sudo e outros sobre o funcionamento do bash ...
Por padrão, sudoele procurará apenas por comandos e ignorará o shell; portanto, a execução simples funcionará sudo llapenas se houver um llexecutável em um dos diretórios do $PATH. Portanto, para usar aliases (ou funções), você precisa garantir que um shell seja chamado como parte do processo.
Uma maneira seria executar algo como sudo shou sudo bash, embora moderno sudo(estou testando isso no sudo 1.8.19p1) tenha opções -se -ipara esse fim.
Portanto, uma tentativa seria algo como sudo -s ll(o que equivale a sudo bash -c 'll', supondo que você $SHELLseja o Bash, que parece ser o caso com base no que rcfilevocê mencionou.) Mas isso também não funciona, pois inicia o shell de forma não interativa, modo sem login, que não lê nenhum dos arquivos de inicialização. É essencialmente o mesmo que se você escrever um script de shell e usá #!/bin/bash-lo para executá-lo. Os aliases (e funções) que você possui ~/.bashrcnão serão acessíveis a partir desse script ...
Então, a seguir está a -iopção, que cria um shell de login. Isso é mais promissor, uma vez que vai ler seus arquivos de inicialização! E, no entanto, sudo -i ll(equivalente a sudo bash -l -c 'll') ainda não funcionará. Então, como isso é possível, dado que ele leu a definição do llpseudônimo?
Bem, a próxima explicação aqui é que, por padrão, o bash não expandirá aliases, exceto quando o shell for interativo ... Esse shell iniciado por sudo -i(ou bash -l) é um shell de logon , mas ainda não é interativo.
Portanto, o próximo passo é obter um shell interativo , que funciona :
sudo bash -i -c 'll'
(Ter login e interativo também é bom, é claro, bash -l -i -c ...funcionará.)
Outra alternativa é continuar usando um shell de login (não interativo), mas peça explicitamente para expandir aliases, para que isso também funcione:
sudo bash -l -O expand_aliases -c 'll'
(O caso em que o bash era interativo não precisava de um shell de logon , pois isso é suficiente para ler os arquivos de inicialização, mas este precisa -lser lido.)
Essas são linhas de comando razoavelmente longas ... E também exigem que você cite todo o comando do shell; portanto, se você estiver chamando um alias com argumentos, terá que transformar tudo isso em uma string ... desajeitado de usar ...
Note que anteriormente eu estava falando sobre aliases e funções ... Isso foi proposital, pois as funções são realmente muito mais convenientes aqui. Você não precisa de nada de especial (como ter um shell interativo ou definir uma opção específica) para executar funções em um shell, desde que você obtenha a definição deles.
Portanto, se você definiu llcomo uma função em vez de um alias, poderá usá-lo diretamente com o -iatalho do sudo :
sudo -i ll
E se você tiver uma linha de comando mais longa, com argumentos, poderá passá-los diretamente aqui também:
sudo -i ll -C -R /etc
(Compare com sudo bash -i -c 'll -C -R /etc'.)
As funções também são muito mais flexíveis e geralmente mais fáceis de manter ... Geralmente, é fácil converter um alias em uma função, a única ressalva é sempre usar "$@"onde você espera que argumentos extras sejam tomados (normalmente no final do alias.)
Por exemplo, este alias:
alias ll='ls $LS_OPTIONS -l'
Pode ser transformado nesta função:
ll () {
ls $LS_OPTIONS -l "$@"
}
Eles são, para a maioria dos propósitos, equivalentes. E, como mencionado anteriormente, a função deve ser acessada diretamente de sudo -i, portanto, esse é um bônus adicional.
Espero que você ache útil esta resposta e explicação!
/root/.bashrcmas na verdade o que o Q está procurando são os aliases desse arquivo - isso não é possível por isso - unix.stackexchange.com/questions/1496/… .