Ubuntu 20.04执行sudo -iu bob启动脚本时LD_LIBRARY_PATH未从.bashrc加载
根因说明
- Ubuntu 20.04 默认用户
.bashrc文件头部新增了非交互式会话拦截逻辑:case $- in *i*) ;; *) return;; esac。你执行sudo -iu bob /opt/builder/bin/start.sh时,bash 以带命令参数的非交互式登录 shell 启动,会直接触发 return 逻辑,不会加载后续的LD_LIBRARY_PATH配置,这是16.04到20.04的默认行为差异。 - sudo 默认开启
env_reset配置,会自动清理所有未明确放行的环境变量,同时系统安全模块默认会删除LD_LIBRARY_PATH变量,即使上层会话存在该变量也无法传递到sudo执行的进程中。
系统级解决方案
以下方案按安全性从高到低排序:
- 方案1:配置系统全局动态链接库路径(最推荐,无环境变量依赖)
直接将Oracle客户端库路径加入系统动态链接配置,所有用户、所有进程都可以直接识别,无需依赖LD_LIBRARY_PATH环境变量:- 新建配置文件:
sudo vim /etc/ld.so.conf.d/oracle-client.conf - 写入内容:
/usr/lib/oracle/12.2/client64/lib - 执行命令生效:
sudo ldconfig
- 新建配置文件:
- 方案2:修改sudo配置放行指定环境变量
不需要调整shell配置,仅放开sudo对LD_LIBRARY_PATH的限制:- 执行命令编辑sudo自定义配置:
sudo visudo -f /etc/sudoers.d/custom-env - 添加配置(可按需限制仅对bob用户生效):
# 全局生效 Defaults env_keep += "LD_LIBRARY_PATH" # 仅对bob用户生效的配置 # Defaults:bob env_keep += "LD_LIBRARY_PATH" - 保存退出即可生效
- 执行命令编辑sudo自定义配置:
- 方案3:修改用户
.bashrc的非交互式拦截逻辑
编辑bob用户的~/.bashrc文件,将头部的非交互式判断逻辑注释掉,或者将export LD_LIBRARY_PATH=xxx的配置移动到判断逻辑之前,这样非交互式会话也可以加载到对应变量。
内容的提问来源于stack exchange,提问作者hplodur
相关产品推荐
相关产品推荐

