erro de abertura de arquivo de objeto compartilhado com “comando sudo” mas NÃO com “sudo bash” então mesmo comando?

2

Eu estou tendo dificuldades para entender como o LD_LIBRARY_PATH é tratado de maneira diferente nos três casos a seguir:

  • executado como usuário comum
  • executar via " comando sudo "
  • executar via " sudo bash " seguido no shell da raiz por " comando "

Meu problema particular é que um binário que estou tentando executar (chamado dc_full) requer acesso sudo, mas gera o seguinte erro quando executado como "comando sudo":

ljw@test$ sudo ./dc_full 
./dc_full: error while loading shared libraries: libthrift-0.9.1.so: cannot open shared object file: No such file or directory

ljw@test$ sudo bash
root@ljw-vm1:~/test# ./dc_full
.
...<works fine here!> 
.

Eu tenho a seguinte linha em /etc/bash.bashrc e em ~ / .bashrc para o usuário ljw.

root@ljw-vm1:~# grep LD_LIBRARY ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

root@ljw-vm1:~# grep LD_LIBRARY /etc/bash.bashrc 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

Eu esperaria que isso abrangesse os casos sudo e sudo-bash, um cobre o shell do usuário e um cobre o shell "root". Mas claramente isso não está acontecendo.

Encontrei referências ao ldd, o que me dá uma grande dica de que não está funcionando, mas não exatamente POR QUE ...

root@ljw-vm1:~/dc_full# ldd ./dc_full | grep thrift
    libthrift-0.9.1.so => /usr/local/lib/libthrift-0.9.1.so (0x00007eff19e7c000)

ljw@ljw-vm1:~/dc_full$ ldd ./dc_full | grep thrift
    libthrift-0.9.1.so => /usr/local/lib/libthrift-0.9.1.so (0x00007f8340cc5000)

ljw@ljw-vm1:~/dc_full$ sudo ldd ./dc_full | grep thrift
[sudo] password for ljw:
    libthrift-0.9.1.so => not found

Como o LD_LIBRARY_PATH é definido em cada um desses três casos?

    
por ljwobker 27.11.2014 / 04:34

2 respostas

3

Permitir que LD_LIBRARY_PATH para binários suid, como o sudo, seja um problema de segurança, portanto, o LD_LIBRARY_PATH é removido do ambiente. sudo por padrão não passa LD_LIBRARY_PATH para seus filhos para as mesmas preocupações de segurança: bibliotecas cuidadosamente criadas permitem que você ignore as restrições de argumento sudo para executar o que quiser.

Se você precisar de um conjunto de variáveis como este, use sudo -E ou passe as variáveis env na linha de comando da seguinte forma: sudo -- LD_LIBRARY_PATH=/usr/local/lib dc_full . O sudo terá que ser configurado para permitir que você passe variáveis de ambiente, que geralmente não precisam de configuração manual.

    
por 27.11.2014 / 05:33
1

Adicione / usr / local / lib a /etc/ld.so.conf e execute ldconfig, então você terá este caminho adicionado como um caminho padrão para bibliotecas.

    
por 27.11.2014 / 07:53