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

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

我很难理解在以下三种情况下如何以不同方式处理 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,然后您将将此路径添加为库的默认路径。

相关内容