我正在编写一组实用程序,bash
其中包含一个公共库。我编写的每个脚本都必须有一段代码来确定库相对于可执行文件的路径。不是实际代码,而是一个示例:
#!/bin/bash
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. $DIR/../lib/utilities/functions
我没有尝试搜索库的序言,而是使用环境变量来指示库位置的好主意。
#!/bin/bash
. $TOOLS_LIBRARY_PATH
我可以使用包装程序来设置该环境变量,或者我可以将它设置在我自己的路径中。可能有更好的方法来组织bash
工具集,但问题是:
我可以信任我的环境变量吗?
这是其中之一,我从来没有真正考虑过这种问题。当用其他语言编程时,路径被用来查找库,(例如LD_LIBRARY_PATH
, PYTHONPATH
, PERLLIB
, RUBYLIB
, CLASSPATH
, NODE_PATH
),但我从来没有停下来想一想这怎么可能是不安全的。
事实上,LD_LIBRARY_PATH
有WhyLD_LIBRARY_PATH
不好阻止它的使用。如果分别调用 Ruby 和 Perl 库路径环境变量$SAFE
和-T
(污点模式)的安全机制,则忽略它们。
到目前为止我的想法...
- 用户可以设置
TOOLS_PATH_LIBRARY
为他们选择的库,但该实用程序将在他们的 uid 下运行。他们可以直接使用bash
. - 我的工具
sudo
有些东西。有人可以将他们设置TOOLS_PATH_LIBRARY
为利用这一点的东西。但是,这些工具不是通过 运行的,它们只是在这里和那里sudo
调用。sudo
无论如何,用户都必须是一个sudoer
,他们可以直接调用sudo
。 - 如果我不能信任
TOOLS_PATH_LIBRARY
,那么我就不能信任PATH
。所有程序调用都必须使用绝对路径。 - 我见过 shell 程序为绝对的程序使用别名,所以不要调用
ls
,而是使用变量,比如LS=/bin/ls
. 根据我的阅读,这是为了防止用户将程序默认值重新定义为别名。请参阅:PATH、功能和安全性。Bash 脚本最佳实践。 . - Perl 的污染模式将所有环境变量视为“污染”,这是不祥之兆,这就是为什么我试图推理环境风险的原因。
- 一个用户不可能更改另一个用户的环境,除非该用户是 root。因此,我只关心用户更改自己的环境以提升权限。请参阅:有没有办法更改另一个进程的环境变量?
我已经把它变成了各种各样的答案,但我仍然会发布它,因为它不是一个简单的答案。
更新:围绕使用环境变量指定库和可执行文件路径的安全问题是什么?