No bash 4.3.27, “su” ignora as variáveis do usuário ao combinar “-” com “-c command”?

2

Como para sempre , lançamos scripts de usuário a partir de um crontab de usuário diferente assim:

00 12 * * 1 su - user2 -c "/home/user2/myscript.sh"

Ao fazer isso, o script é iniciado após o shell interativo carregar ~ / .bash_profile.

No entanto, recentemente corrigimos o Bash para a versão 4.3.27, por causa da vulnerabilidade "shellshock", e isso não está mais funcionando.

Ainda temos uma cópia do bash antigo para que possamos testar o problema:

[root ~]$ /bin/bash --version
GNU bash, versión 4.3.30(1)-release (x86_64-unknown-linux-gnu)

[root ~]$ /bin/bash.old --version
GNU bash, versión 4.1.2(1)-release (x86_64-redhat-linux-gnu)

[root ~]$ echo "export MYNEWVAR=helo" >> /home/usertest/.bash_profile

[root ~]$ su -s /bin/bash - usertest -c "env | grep MYNEWVAR"
[root ~]$ su -s /bin/bash.old - usertest -c "env | grep MYNEWVAR"
MYNEWVAR=helo

Este é um comportamento esperado? ou perdemos para habilitar alguns recursos na etapa configure da compilação bash?

Atenciosamente.

    
por vegatripy 07.11.2014 / 14:17

1 resposta

-1

Atualizado desde o rebaixamento de votos, por favor, se isso corrige o problema, pois parece que quando eu usei uma máquina virtual e arco, por favor vote, então eu recebo o -1 removido, por favor.

Se o seu sistema usa o SUDO, veja a segunda metade abaixo ...

Para sistemas que usam SU somente:

Em alguns sistemas, ele pode ser colocado em alias, portanto, mesmo se você usar su, o auto usa su - o que força o uso das variáveis do novo usuário como encontrado em seu bashrc

Olhe seu usuário pessoal bash.rc para o alias mencionado abaixo e remova-o. Isso deve impedir que ele tente usar as variáveis de conjunto do usuário root.

página: link
Bit relevante:

Thus, administrators should generally use su as follows:

$ su -

An identical result is produced by adding the username root:

$ su - root

Likewise, the same can be done for any other user (e.g. for a user named archie):

# su - archie

You may wish to add an alias to ~/.bashrc for this:

alias su="su -"

Para sistemas SUDO

Isso é por causa da configuração do sudo. Eu usei a seguinte pergunta / resposta para me seguir: link

Basicamente:

A página de manual para sudoers states:

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, MAIL, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller's environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

e é assim que isso é abordado:

Então, você pode fazer o seguinte para manter as variáveis ao usar o sudo

sudo visudo

isto irá abrir as configurações do sudo para você. Então, por que eu adicionei o seguinte abaixo

Defaults secure_path="blah"

Defaults env_keep +="VARIABLE VARIABLE VARIABLE"

(EXCLUINDO PATH como é definido por secure_path) e esses são apenas espaços únicos entre cada variável se você deseja ter mais de 1 mantido.

e o que isto faz é dizer ao sudo quais variáveis env devem manter e não desconsiderar.

Quando terminar, segure ctrl e aperte o para Write Out, digite e diga sim para salvar [mesmo que especifique um arquivo tmp OK, ele será escrito de volta na configuração principal apenas diga sim quando perguntado se você deseja sobrescrever ].

Isso deve permitir que você mantenha as variáveis que desejar (uma grande delas é JAVA_HOME e também http_proxy se você usar um proxy).

Por isso, deve ser algo como abaixo, incluindo sua variável especificada:

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/bin"
Defaults        env_keep +="GRAILS_HOME"

e para verificar se é necessário sair de todas as janelas de terminal abertas e reabrir uma e executar

echo $GRAILS_HOME 

Deve ser o que você definir, agora emitir

sudo echo $GRAILS_HOME

e agora deve permanecer inalterado.

A referência Grails_home é de mim ajudando outro usuário em comunidades do Ubuntu assim apenas sub que com o nome da sua variável.

    
por 07.11.2014 / 14:30