Como posso obter comandos sudo para usar as configurações em /root/.bashrc

9

Eu personalizei .bashrccom vários alias, especificamente lleexport 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 envshows HOME=/rooteSHELL=/bin/bash

Como posso obter sudocomandos 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.

Milliways
fonte
@ daniel-gelling - Eu sempre senti que esse Q é um problema XY - meta.stackexchange.com/questions/66377/what-is-the-xy-problem . O título indica que eles querem algo fora, /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/… .
Slm
@slm que eu estou atrás é a adição de um método para bashrc - como eu fiz no meu arquivo .bashrc pessoal, bem como o arquivo .bashrc para o root para "desativar" a -ropção para crontab: crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}. Isso funciona quando conectado como usuário, no entanto, quando eu o executo, sudo crontab -rele ainda é executado.
Daniel Gelling
@ DanielGelling - veja se minha resposta funciona para o seu cenário.
slm

Respostas:

6

sudoexecuta um executável, não um comando shell. Portanto, ele não sabe sobre aliases. Se você executar sudo ls, é como sudo /bin/lsse não usasse nenhum lsalias que você possa ter.

Você pode sudo lsexpandir o alias colocando o seguinte em seu .bashrc:

alias sudo='sudo '

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 .bashrcnão serve para nada). Mas isso afetaria variáveis ​​que são usadas pelo comando, como LS_COLORS. Você pode configurar o sudo para manter determinadas variáveis ​​de ambiente editando sua configuração: execute visudoe inclua a linha

Defaults env_keep += "LS_COLORS"

Com essas configurações, sudo llvocê 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 ( ~/.bashrcpara bash). Dependendo de como o sudo estiver configurado, isso pode ser HOMEdefinido como seu diretório pessoal ou alterado para /root. Você pode forçar o diretório inicial a ser definido como root sudo -Hs; por outro lado, para manter o diretório inicial original, execute sudo env HOME="$HOME" bash.

Gilles 'SO- parar de ser mau'
fonte
3

Agradeço a quem respondeu, que me levou a ler com man sudomais atenção.

sudo -s Se nenhum comando for especificado, um shell interativo será executado.

Este shell interativo usa /root/.bashrce, portanto, inclui minhas personalizações.

Exige que o comando seja inserido separadamente, mas isso está OK.

Milliways
fonte
2

fundo

Sempre achei que essa pergunta é um problema XY . O título indica que eles querem alguma coisa, /root/.bashrcmas 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 sudoem 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/.bashrcque 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/.bashrce usuários raiz /root/.bash_profile.

$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }

$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }

Sem fazer nada, nenhum desses trabalhos (sem surpresas):

$ sudo brc_smurf
sudo: brc_smurf: command not found

$ sudo bpf_smurf
sudo: bpf_smurf: command not found

Vemos que o aliascomando não mostra aliases quando executado sudo:

$ sudo alias
$

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:

$ sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'

Legal, então talvez possamos executá-lo?

$ sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory

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.

$ sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc

Aqui podemos ver nossa mensagem /root/.bashrc, executamos com êxito o alias do usuário root brc_smurf.

Etapa # 3 - e os env vars?

Se você estiver usando o método mostrado acima, agora também deve funcionar.

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc

Etapa # 4 - e as funções?

Isso funciona também como esperado:

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc

TLDR;

Você pode fazer isso para obter acesso às variáveis ​​de ambiente + aliases de /root/.bashrc:

$ sudo bash -ci 'shopt -s expand_aliases; <cmds>'

Aprendizado

Este método ativa o conteúdo de /root/.bashrc, ele não captura o conteúdo de /root/.bash_profile.

Referências

slm
fonte
Sim, mesmo que haja algumas pequenas diferenças entre eles, não vamos entrar em detalhes aqui ;-). De qualquer forma, você poderia me ajudar com a situação que afirmei nos comentários da pergunta: usando funções no .bashrcsudo; removendo especificamente a -ropção de crontab?
Daniel Gelling
Ok, mas isso significaria que eu teria que executar: em sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'vez de um simples sudo echo $brc_smurf_env?
22718 Daniel Gelling
Você pode remover o aliasque era simplesmente para mostrar a eles, você precisa fazersudo bash -ci 'shopt -s expand_aliases; <cmds>'
SLM
Seria muita digitação apenas para editar meu crontab como root. Deixe-me criar um pseudônimo para ele :-P
Daniel
@DanielGelling - sim, bem-vindo a toda a diversão nas entranhas.
slm
0

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ê.

hvindin
fonte
0

Digamos que editamos /root/.bashrc para:

$ sudo su -
Password: ******
# cat ~/.bashrc

echo "root bashrc file was read"
PATH=~/bin:$PATH
echo "$PATH"
export USERVAR=set
echo "$USERVAR"

umask 022
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

Permite fazer logoff e logon novamente para fazer o bash ler o arquivo:

# exit
$ sudo su -
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@here:~# alias l
alias l='ls $LS_OPTIONS -lA'
root@here:~# 

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.

root@here:~# exit
$ sudo env | grep USERVAR              # no output 
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

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 .bashrcarquivo será carregado automaticamente e começará a funcionar.

Você pode iniciar o bash assim:

$ sudo bash
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@mail:/home/isaac/me/temp/clocks-master#

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:

$ sudo su -

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:

$ alias mysu='sudo su -'
$ mysu
# 
Isaac
fonte
0

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!

filbranden
fonte
DV - Eu não acho que isso esteja melhorando a situação mais do que o que já está aqui também.
slm
1
@slm eu acho que a minha resposta é a adição de alguma coisa, uma vez que nenhuma resposta anterior mencionou a forma sudo -i command argumentsde ser capaz de executar funções de /root/.bashrce 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.
26618 filbranden