다음 세 가지 경우에 LD_LIBRARY_PATH가 어떻게 다르게 처리될 수 있는지 이해하는 데 어려움을 겪고 있습니다.
- 일반 사용자로 실행
- "실행"을 통해sudo 명령"
- "실행"을 통해수토 배쉬" 루트 쉘에서 "주문하다"
내 특별한 문제는 내가 실행하려는 바이너리(dc_full이라고 함)에 sudo 액세스가 필요하지만 "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!>
.
사용자 ljw에 대해 /etc/bash.bashrc 및 ~/.bashrc 모두에 다음 줄이 있습니다.
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
이것이 sudo 및 sudo-bash 사례를 모두 다루기를 바랍니다. 하나는 사용자 셸을 다루고 다른 하나는 "루트" 셸을 다룹니다. 그러나 분명히 그런 일은 일어나지 않았습니다.
나는 그것이 작동하지 않는다는 큰 힌트를 주는 ldd에 대한 참조를 찾았지만 정확한 이유는 알 수 없습니다...
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
LD_LIBRARY_PATH
이 세 가지 상황은 어떻게 설정됩니까?
답변1
suid 바이너리(예: sudo)에 대해 LD_LIBRARY_PATH를 허용하는 것은 보안 문제이므로 LD_LIBRARY_PATH가 환경에서 제거됩니다. 동일한 보안상의 이유로 sudo는 기본적으로 LD_LIBRARY_PATH를 하위 항목에 전달하지 않습니다. 잘 설계된 라이브러리를 사용하면 sudo 매개변수 제한을 우회하여 원하는 작업을 수행할 수 있습니다.
이러한 변수 세트가 필요한 경우 sudo -E
다음과 같이 명령줄에서 환경 변수를 사용하거나 전달하세요 sudo -- LD_LIBRARY_PATH=/usr/local/lib dc_full
. 일반적으로 수동 구성이 필요하지 않은 환경 변수를 전달할 수 있도록 sudo를 구성해야 합니다.
답변2
/etc/ld.so.conf에 /usr/local/lib를 추가하고 ldconfig를 실행하면 이 경로가 라이브러리의 기본 경로로 추가됩니다.