Estou usando bash após esta provação?

3

No Mountain Lion, host Coguaro , eu faço login como usuário coconutpowder usando bash :

Coguaro:~ coconutpowder$ echo $0
-bash

Eu preciso executar um comando com privilégios elevados, então tento su mudar para root , mas não me permite:

Coguaro:~ coconutpowder$ su -
Password:
su: Sorry

Feir o suficiente. Eu li a página man de su e obtenho isto:

PAM is used to set the policy su(1) will use.
In particular, by default only users in the ''admin'' or ''wheel''
groups can switch to UID 0 (''root'').

Noto que não faço parte de nenhum dos grupos com permissão para su ao fazer isso:

Coguaro:~ coconutpowder$ id
uid=502(coconutpowder) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts)

para que eu execute novamente o comando su prefixando-o com um sudo , que tenho permissão para fazer como estou em /etc/sudoers :

/etc/sudoers: coconutpowder ALL=(ALL) ALL

Coguaro:~ coconutpowder$ sudo su -
Coguaro:~ root# echo $USER $0 $BASH_VERSION
root -sh 3.2.48(1)-release
Coguaro:~ root# 

Agora, tenho o que considero um cenário problemático, pois estou executando sh para o que eu vejo, que é meu shell de login para root , mas tenho a variável de ambiente BASH_VERSION definida em meu login anterior, transmitido pelo mecanismo sudo ? Corrija-me se estiver errado.

Isso significa alguns truques de detecção de shell como este intervalo:

if [ ${BASH_VERSION-not_running_within_bash} = not_running_within_bash ]; then
  # ...
fi

Estou com uma perda total de como% corretamentesu to root e tenho alguma maneira de determinar com certeza se estou usando bash ou não. O script usa matrizes Bash extensivamente e pode destruir caminhos do sistema de arquivos se alguns valores forem espúrios. Eu achei o ps -p $$ hacks mencionado em outro lugar um pouco de um hack (?!) Então estou procurando a melhor maneira de realizar o que eu estou tentando realizar, considerando que eu devo logar primeiro como coconutpowder e não posso fazer assim como root diretamente.

Se eu estou fazendo o usuário mudar errado, acredito que esta questão é distintamente diferente das outras que proliferaram em torno de apenas detectar o atual (não "padrão" ou "atribuído" ) shell.

Até agora, estou tentando analisar $ 0, possivelmente removendo qualquer caractere - prefixado para denotar um shell de login.

A menos que algum de vocês possa me ensinar como su to root com login (ou seja, lendo $ HOME / .profile) e mudar diretamente para bash do padrão sh , que não pode ser alterado .

    
por Robottinosino 12.09.2012 / 07:37

2 respostas

4

Now I have what I think is a problematic scenario as I am actually running sh for what I can see, that is my login shell for root after all, but I have the BASH_VERSION environment variable set from my earlier login, passed along via the sudo mechanism? Correct me if I am wrong.

Felizmente, você está errado. As variáveis de ambiente BASH_VERSION e semelhantes são definidas , mas não exportadas , de modo que não existem para processos filhos.

Compare a saída de:

set | grep ^BASH

com

env | grep ^BASH

As variáveis de ambiente de exibição set e env . set é um shell embutido e vê as variáveis BASH_* . env é um programa externo, e você notará que ele não vê as variáveis BASH_* .

Se você queria desejar exportar essas variáveis para processos filho, poderia fazê-lo manualmente e, em seguida, apareceria em env :

$ export BASH_VERSION
$ env | grep ^BASH
BASH_VERSION=4.2.36(1)-release

Mas, a menos que você os tenha exportado manualmente assim, você pode ter certeza de que a presença de BASH_VERSION significa que você está realmente executando o bash. Veja também a saída de export -p para descobrir quais variáveis serão exportadas dessa maneira.

    
por 12.09.2012 / 20:07
1

Sim, você ainda está usando o bash. BASH_VERSION é uma variável de shell, não uma variável de ambiente: ela é definida apenas nesse shell, não é exportada para outros processos. (Consulte Diferença entre variáveis de ambiente e variáveis de ambiente exportadas no bash e Quais escopos as variáveis de shell podem ter? ).

Como $0 mostra -sh , esse shell é um shell de login . É bash, mas começou com o nome sh . Quando o bash é iniciado como sh , ele se comporta de maneira diferente: ele desativa alguns recursos específicos do bash para ser mais compatível com outros shells.

Não se preocupe com o comando su . Para obter um shell de login interativo como root, execute sudo -i . Você pode especificar um shell alternativo para executar, por exemplo %código%. Para executar um shell interativo que retenha algumas de suas variáveis de ambiente e não execute sudo -i zsh ou outros arquivos de login do root, execute .profile .

    
por 13.09.2012 / 02:33