Fonte meu perfil bash quando eu su no OS X

3

Gostaria de pesquisar meu .bash_profile (ou talvez outro arquivo) sempre que eu alternar para o superusuário. ( .bash_profile é o login rc no Mac OS X, .bashrc é o script que não é de login e .profile é um login rc executado para qualquer shell).

Simplesmente, meu .bash_profile torna o uso de um terminal mais conveniente para mim e, naqueles momentos em que eu tenho que ficar super, sinto que estou tentando tocar guitarra sem polegares. Mais do que isso, $PS1 e $PROMPT_COMMAND são exportados para o superusuário, mas as funções definidas no meu .bash_profile e usadas no meu $PROMPT_COMMAND não são exportadas para esse ambiente léxico.

Em particular, eu faço a fonte do script git-prompt.sh no meu .bash_profile e uso o comando exportado __git_ps1 no meu $PROMPT_COMMAND . Assim, cada linha de prompt no shell de superusuário é precedida pelo aviso:

bash: __git_ps1: command not found.

Agora eu tecnicamente poderia modificar o rc em todo o sistema em /etc/profile para obter o efeito. Eu poderia olhar para $HOME , e se for minha casa, então a fonte $HOME/.bash_profile . No entanto, isso não é portátil. Eu teria que modificar o /etc/profile em cada host no qual eu provavelmente estaria trabalhando. Eu quero exportar esse comportamento para acontecer em todos os hosts em que trabalho.

Alguém pode pensar em uma solução que esteja completamente contida no perfil meu próprio bash?

Não são necessários avisos sobre como se tornar um superusuário. Eu sei que há sudo , e que é ruim, ruim, ruim, e eu sou moral e intelectualmente inferior por fazer isso. :)

O su do Mac OS X não tem a opção -c , o que seria uma boa solução.

    
por masonk 25.08.2013 / 16:18

2 respostas

0

Tudo bem. Eu tenho algo agora. Não é bonito, mas funciona. O principal truque é que posso fazer com que o código seja executado no shell do superusuário alterando $PROMPT_COMMAND no ambiente. $PROMPT_COMMAND é executado imediatamente ao alternar para o novo ambiente, e o su preserva as variáveis de ambiente bash.

Assim, aqui está a solução que estou usando:

alias su="export REAL_HOME=$HOME && export SWITCHING_TO_SU=true && export PROMPT_COMMAND='source $HOME/.bash_profile; $PROMPT_COMMAND' && su"

Agora, meu .bash_profile será executado assim que eu alternar para o superusuário, e ele saberá duas informações importantes: 1) que está sendo executado porque estou mudando para superusuário e 2) o localização do meu diretório pessoal real. Ele pode usar essa informação para fazer qualquer outra coisa que precise fazer. Em particular, meu .bash_profile redefinirá $PROMPT_COMMAND de volta ao seu verdadeiro valor, de modo que o script seja originado somente ao alternar para o su. No final do script, eu tenho

if [[ "$SWITCHING_TO_SU" == 'true' ]]; then
    unset SWITCHING_TO_SU
    unset REAL_HOME
fi

Um truque semelhante baseado no aliasing exit() poderia ser usado, acredito, para fazer algo ao sair do superusuário.

    
por 25.08.2013 / 18:04
0

Se você su do seu $ HOME, você poderia fazer

. .bash_profile
    
por 25.08.2013 / 16:30