当 Ubuntu 20.04 上的 sudo -iu bob /opt/builder/bin/start.sh 时,LD_LIBRARY_PATH 不是来自 .bashrc

Posted

技术标签:

【中文标题】当 Ubuntu 20.04 上的 sudo -iu bob /opt/builder/bin/start.sh 时,LD_LIBRARY_PATH 不是来自 .bashrc【英文标题】:LD_LIBRARY_PATH not sourced from .bashrc when sudo -iu bob /opt/builder/bin/start.sh on Ubuntu 20.04 【发布时间】:2021-12-29 08:21:57 【问题描述】:

我最近从 Ubuntu 16.04 迁移到 Ubuntu 20.04。当我尝试启动脚本时,似乎LD_LIBRARY_PATH 不是来自用户.bashrc

我执行命令的方式是 sudo -iu bob /opt/builder/bin/start.sh

我的.bashrc 包含export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/12.2/client64/lib:

我的 ~/.bash_profile~/.profile 正在采购 ~/.bashrc

/etc/sudoers 与 Ubuntu 16.04 上的相同

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

sudoers.d 没有包含任何内容。

有人见过这样的行为吗?我知道解决方案可能是在start.sh 中添加source ~/.bashrc,但我确信对于改变的行为有一个系统范围的解决方案。

【问题讨论】:

LD_LIBRARY_PATH 是否设置在 bob 的 .bash_profile.bash_login.profile 中?您是在其他用户的登录 shell (sudo -i) 中运行该命令,还是用户 bob 也在运行该命令? @frippe LD_LIBRARY_PATH 设置在 .bashrc 中,但 .bash_profile.profile 正在采购 .bashrc。我将命令sudo -iu 运行为root 如果LD_LIBRARY_PATH 仅设置为root 而不是bob,则当您在登录shell 中为其他用户(即@987654350)运行脚本时不会设置它@)。您可以在bob 的shell 启动脚本中设置环境变量,或者使用-E 标志调用sudo 以保留环境(这不能与-i 一起使用), @frippe LD_LIBRARY_PATH 根本没有设置为 root。仅针对 bob 设置 是什么让您认为LD_LIBRARY_PATH 未设置?您是否确认该变量确实未设置? bob 的默认 shell 是什么? 【参考方案1】:

默认的.bashrc 在脚本的最顶部有一个检查,以检查它是否从交互式shell 运行。如果不是,它将不会运行。

bash 的手册页说:

交互式 shell 启动时没有非选项参数(除非指定 -s)且没有 -c 选项[...]

来自sudo 命令的-i 选项的文档:

如果指定了命令,则通过 shell 的 -c 选项将其传递给 shell 执行。

这意味着sudo -iu bob /opt/builder/bin/start.sh 在非交互式登录shell 中运行,这意味着.bashrc 将提前返回并且永远不会到达您设置LD_LIBRARY_PATH 的部分。

您可能还希望在 LD_LIBRARY_PATH 中不包含前导和/或尾随 :。这将使ld 在当前目录中查找可能被利用的库。

【讨论】:

以上是关于当 Ubuntu 20.04 上的 sudo -iu bob /opt/builder/bin/start.sh 时,LD_LIBRARY_PATH 不是来自 .bashrc的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 20.04 Ubuntu 22.04 系统创建用户并授权sudo权限

ubuntu 20.04部署elasticsearch 8.*(安装es)

ubuntu20.04找不到start命令

ubuntu20.04 安装微信

Ubuntu 20.04 安装微信qq等

Ubuntu 20.04 上安装 Nginx 转载