"sudo 명령"을 사용하여 공유 객체 파일을 열었지만 "sudo bash"는 사용하지 않고 동일한 명령을 사용하는 중에 오류가 발생했습니까?

"sudo 명령"을 사용하여 공유 객체 파일을 열었지만 "sudo bash"는 사용하지 않고 동일한 명령을 사용하는 중에 오류가 발생했습니까?

다음 세 가지 경우에 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를 실행하면 이 경로가 라이브러리의 기본 경로로 추가됩니다.

관련 정보