我很难理解在以下三种情况下如何以不同方式处理 LD_LIBRARY_PATH:
- 以普通用户身份运行
- 通过“运行须藤命令”
- 通过“运行须藤巴什“ 在根 shell 中紧接着是”命令”
我的特殊问题是,我尝试运行的二进制文件(称为 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 情况,一种涵盖用户 shell,一种涵盖“root”shell。但显然这并没有发生。
我发现了对 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
允许 LD_LIBRARY_PATH 用于 suid 二进制文件(如 sudo)是一个安全问题,因此 LD_LIBRARY_PATH 会从环境中删除。出于同样的安全考虑,sudo 默认情况下不会将 LD_LIBRARY_PATH 传递给其子级:精心设计的库将允许您绕过 sudo 参数限制来执行您想要的任何操作。
如果您需要这样的变量集,请使用sudo -E
,或在命令行上传递环境变量,如下所示:sudo -- LD_LIBRARY_PATH=/usr/local/lib dc_full
。必须配置 sudo 以允许您传递环境变量,这通常不需要手动配置。
答案2
将 /usr/local/lib 添加到 /etc/ld.so.conf 并运行 ldconfig,然后您将将此路径添加为库的默认路径。