当 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权限