共享对象文件打开错误与“sudo 命令”但不是“sudo bash”然后相同的命令?

ljw*_*ker 5 linux sudo libraries

对于以下三种情况,我很难让我的大脑围绕 LD_LIBRARY_PATH 的处理方式不同:

  • 以普通用户身份运行
  • 通过“ sudo 命令”运行
  • 通过“ sudo bash ”运行,然后在根shell中通过“ command

我的特殊问题是我尝试运行的二进制文件(称为 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!> 
.
Run Code Online (Sandbox Code Playgroud)

我在用户 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
Run Code Online (Sandbox Code Playgroud)

我希望这涵盖 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
Run Code Online (Sandbox Code Playgroud)

LD_LIBRARY_PATH在这三种情况下如何设置?

And*_*zek 5

允许 LD_LIBRARY_PATH 用于像 sudo 这样的 suid 二进制文件是一个安全问题,因此 LD_LIBRARY_PATH 被从环境中剥离出来。出于相同的安全考虑,sudo 默认情况下不会将 LD_LIBRARY_PATH 传递给它的孩子:精心设计的库将允许您绕过 sudo 参数限制以执行您想要的任何内容。

如果您需要设置的变量,这样无论是使用sudo -E,或通过ENV变量在命令行上像这样:sudo -- LD_LIBRARY_PATH=/usr/local/lib dc_full。sudo 必须配置为允许您传递环境变量,这通常不需要手动配置。