我想知道是否可以在 Bash 中获取文件(使用. filename
或source filename
),但仅从中继承环境变量和函数,而忽略任何其他行。
例如,要获取的文件可能包含以下行:
my_var="Something"
do_something_quickly() {
some_command
another_command
}
another_var="Something-Else"
some_command
final_var="FinalString"
我希望能够获取此文件和其他类似文件,但仅从中获取变量和函数,因此任何其他行(例如可能some_command
是任意且可能是恶意的命令)都将被完全忽略。有办法实现这一点吗?
答案1
我认为你想要的东西是不可能的,或者至少不是很现实。
首先,您说出于安全考虑,您希望保留变量和函数,并忽略函数调用。如果有人有能力在文件中放入不好的东西,那么他也可以将其放入那些有用的函数中,这样你就不会真正躲过子弹。
其次,你说你想保留变量而不运行杂项。脚本代码,但我认为该行并不像您想象的那么清晰。 bash 脚本中的大多数变量都是使用外部变量或通过运行某些代码或其他代码来设置的。诸如此类的行DIR="$( realpath ${0} )";
与“安全”硬编码变体一样常见USERNAME="batman";
。
如果您需要的只是简单的硬编码值,您最好只在文件中查找 VAR=EXPR 样式模式,然后将该列表过滤为有用的内容。
不管怎样,厄运和忧郁已经过去了。如果您没有被劝阻或者我错过了某些内容,那么我可以考虑一些可能适合您的选择。
Bash 有一个
RESTRICTED SHELL
-mode (rbash
);您可以查看 Bash 手册页以获取确切的详细信息,但基本上运行其中的脚本可能会得到您想要的结果,而不会暴露于多种形式的安全风险。您可以在容器 (
docker
/podman
/etc) 或命名空间环境(unshare
以及无人用户帐户)中运行脚本。shopt
公开一个extdebug
可以在 bash shell 或脚本中启用的选项;我已经很久没有使用过它了,但如果我没记错的话,它基本上可以让你执行另一个 shell 脚本,并且该文件中的每个语句基本上都会输入到你的过滤函数中,你可以在其中决定是否要 bash运行该行或跳过它或更改它或w/e。
这些是我想到的主要特征。