Eu personalizei .bashrc
com vários alias, especificamente ll
eexport LS_OPTIONS='--color=auto'
Infelizmente, isso não funciona quando usado sudo
, então eu também modifiquei /root/.bashrc
, mas isso parece não ter feito diferença.
sudo env
shows HOME=/root
eSHELL=/bin/bash
Como posso obter sudo
comandos para usar as configurações /root/.bashrc
?
Entendo que isso acontece apenas quando bash
é executado de forma interativa, por isso estou aberto a outras sugestões sobre como personalizar.
/root/.bashrc
mas 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/… .-r
opção paracrontab
:crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}
. Isso funciona quando conectado como usuário, no entanto, quando eu o executo,sudo crontab -r
ele ainda é executado.Respostas:
sudo
executa um executável, não um comando shell. Portanto, ele não sabe sobre aliases. Se você executarsudo ls
, é comosudo /bin/ls
se não usasse nenhumls
alias que você possa ter.Você pode
sudo ls
expandir o alias colocando o seguinte em seu.bashrc
:Observe o espaço à direita - que informa ao shell para continuar a expansão do alias com a palavra que vem depois
sudo
. Lembre-se de que expandir aliases após o sudo nem sempre é uma boa idéia, depende de que tipo de alias você possui.Além disso, o sudo remove a maioria das variáveis do ambiente. Isso não afetará um alias como
alias ls='ls $LS_OPTIONS'
, porque é uma variável do shell usada pelo shell enquanto expande o comando (e exportá-lo.bashrc
não serve para nada). Mas isso afetaria variáveis que são usadas pelo comando, comoLS_COLORS
. Você pode configurar o sudo para manter determinadas variáveis de ambiente editando sua configuração: executevisudo
e inclua a linhaCom essas configurações,
sudo ll
você fornecerá as cores com as quais está acostumado.Como alternativa, você pode executar um shell raiz com
sudo -s
. Este shell carregará seu arquivo de configuração (~/.bashrc
para bash). Dependendo de como o sudo estiver configurado, isso pode serHOME
definido como seu diretório pessoal ou alterado para/root
. Você pode forçar o diretório inicial a ser definido como rootsudo -Hs
; por outro lado, para manter o diretório inicial original, executesudo env HOME="$HOME" bash
.fonte
Agradeço a quem respondeu, que me levou a ler com
man sudo
mais atenção.sudo -s
Se nenhum comando for especificado, um shell interativo será executado.Este shell interativo usa
/root/.bashrc
e, portanto, inclui minhas personalizações.Exige que o comando seja inserido separadamente, mas isso está OK.
fonte
fundo
Sempre achei que essa pergunta é um problema XY . O título indica que eles querem alguma coisa,
/root/.bashrc
mas na verdade o que a pergunta está depois são os aliases desse arquivo - acredita-se que isso não seja possível por isso - Por que meu script Bash não reconhece aliases? .É basicamente por design que seus aliases não serão detectados
sudo
em outros lugares porque não são portáteis, e essa é a minha opinião também.Qualquer coisa que esteja no ambiente do usuário não deve ser assumida por scripts e qualquer software que possa ser executado em uma determinada caixa. Mas percebo que existem cenários em que pode haver alguns aliases em uma determinada conta de usuário
$HOME/.bashrc
que outros podem querer aproveitar em cenários interativos.Para esse fim, você pode simplesmente dizer ao intérprete do Bash para expandir todos os aliases encontrados durante o processo de login fora dos comportamentos normais do shell nos quais você se depara ao usar
sudo
.Exemplo
Configuração
Para definir as coisas, adicionei os seguintes apelidos, variáveis de ambiente e funções aos meus arquivos
/root/.bashrc
e usuários raiz/root/.bash_profile
.Sem fazer nada, nenhum desses trabalhos (sem surpresas):
Vemos que o
alias
comando não mostra aliases quando executadosudo
:Esse comportamento é sua dica de que você não deve esperar que os aliases estejam acessíveis. Mas continuamos ...
Etapa # 1 - aliases visíveis
Se rodarmos
bash -ci
, podemos induzir o Bash a pelo menos ler o nosso$HOME/.bashrc
:Legal, então talvez possamos executá-lo?
Passo 2 -
shopt -s expand_aliases
Não. Novamente, isso ocorre por design, estamos fazendo algo que não deveríamos estar fazendo; portanto, há uma série de "seguranças" que precisamos desativar. a outra "segurança" é Bash.
Aqui podemos ver nossa mensagem
/root/.bashrc
, executamos com êxito o alias do usuário rootbrc_smurf
.Etapa # 3 - e os env vars?
Se você estiver usando o método mostrado acima, agora também deve funcionar.
Etapa # 4 - e as funções?
Isso funciona também como esperado:
TLDR;
Você pode fazer isso para obter acesso às variáveis de ambiente + aliases de
/root/.bashrc
:Aprendizado
Este método ativa o conteúdo de
/root/.bashrc
, ele não captura o conteúdo de/root/.bash_profile
.Referências
fonte
.bashrc
sudo; removendo especificamente a-r
opção decrontab
?sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'
vez de um simplessudo echo $brc_smurf_env
?alias
que era simplesmente para mostrar a eles, você precisa fazersudo bash -ci 'shopt -s expand_aliases; <cmds>'
Há várias configurações no arquivo / etc / sudoers especificamente ou configurando um ambiente para quando os comandos sudo são executados (por exemplo, certificando-se de que o PATH tenha apenas locais confiáveis), mas dependendo do que você espera obter disso talvez você não consiga fazer o que está procurando se envolver a execução de comandos reais em um shell para configurar o ambiente. Sudoing especificamente não fornece um shell de logon root, portanto, não cria um perfil regular para você.
fonte
Digamos que editamos /root/.bashrc para:
Permite fazer logoff e logon novamente para fazer o bash ler o arquivo:
Como você pode ver, o arquivo foi lido, o PATH foi alterado e os aliases foram definidos. Tudo funciona como você solicita.
No entanto, o sudo ainda não funcionará como você espera.
PATH não mudou. Pode haver maneiras de mudar o caminho dos sudoers, mas eu recomendo fortemente que você evite fazer isso. E, de qualquer maneira, aliases, funções e algumas outras alterações ainda não serão aplicadas alterando apenas o PATH. Um arquivo precisa ser originado. Fazer isso para cada script ou comando solicitará que o computador realize mais trabalhos sem nenhum benefício real. O script não usa aliases (não há uso prático para eles dentro dos scripts).
Portanto, faça o login, o
.bashrc
arquivo será carregado automaticamente e começará a funcionar.Você pode iniciar o bash assim:
Mas, como você vê acima, o pwd (o diretório de trabalho) não mudou e, se você inspecionar um pouco mais, algumas outras configurações também não foram alteradas. É por isso que o comando correto é usar:
Se esse comando for muito longo para digitar, crie um alias ou uma função no usuário (não raiz) onde esse comando será usado, algo como:
fonte
TL; DR: você pode usar
sudo -i
para executar uma função definida/root/.bashrc
(mas não um alias) e também ter acesso às variáveis exportadas desse arquivo: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,
sudo
ele procurará apenas por comandos e ignorará o shell; portanto, a execução simples funcionarásudo ll
apenas se houver umll
executá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 sh
ousudo bash
, embora modernosudo
(estou testando isso no sudo 1.8.19p1) tenha opções-s
e-i
para esse fim.Portanto, uma tentativa seria algo como
sudo -s ll
(o que equivale asudo bash -c 'll'
, supondo que você$SHELL
seja o Bash, que parece ser o caso com base no quercfile
você 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~/.bashrc
não serão acessíveis a partir desse script ...Então, a seguir está a
-i
opçã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 asudo bash -l -c 'll'
) ainda não funcionará. Então, como isso é possível, dado que ele leu a definição doll
pseudô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
(oubash -l
) é um shell de logon , mas ainda não é interativo.Portanto, o próximo passo é obter um shell interativo , que funciona :
(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:
(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
-l
ser 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
ll
como uma função em vez de um alias, poderá usá-lo diretamente com o-i
atalho do sudo :E se você tiver uma linha de comando mais longa, com argumentos, poderá passá-los diretamente aqui também:
(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:
Pode ser transformado nesta função:
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!
fonte
sudo -i command arguments
de ser capaz de executar funções de/root/.bashrc
e têm variáveis exportadas disponível. Mas vejo como minha resposta foi talvez muito longa e essas informações foram enterradas ali ... Então, adicionei um TL; DR para resumir (mantendo os detalhes técnicos da investigação por perto.) Por favor, dê uma outra olhada.