为了安全起见,如何防止在source'd' 文件中执行命令?例如:
#!/bin/sh
source file.cfg
Run Code Online (Sandbox Code Playgroud)
通缉:
get="value"
Run Code Online (Sandbox Code Playgroud)
意外的:
command
Run Code Online (Sandbox Code Playgroud)
您可以使用类似 in 的机制Python。定义变量和/或函数并将可执行命令放入条件块中:
#!/bin/bash
# Variables and functions comes here
a=1
b=2
function foo() {
echo "bar"
}
# Put executable commands here
if [ "$0" = "$BASH_SOURCE" ] ; then
foo
fi
Run Code Online (Sandbox Code Playgroud)
如果您chmod +x运行该文件或通过bash file.sh条件语句中的可执行命令运行它,将被执行。如果您获取文件,则只会导入变量和函数。
长话短说,你不能。我们可以辩论如何尝试阻止执行某些命令,但是如果安全是此处的主要考虑因素,那source是不可行的。您正在寻找一种适当的配置工具— source旨在执行代码。
例如,以下代码提供了简单的键值配置文件解析:
while read -r x; do
declare +x -- "${x}"
done < file.cfg
Run Code Online (Sandbox Code Playgroud)
但这远非灵活性source给您带来的好处,也远非完美的安全解决方案。它不处理任何特定的转义,多行变量,注释…,并且也不过滤分配的变量,因此配置可以覆盖您的宝贵变量。+x用于declare确保配置文件至少不会修改导出到程序的环境的额外参数。
如果您确实想走这条路,则可以尝试改善这一点。但是,如果您真的担心安全性,那么在使用shell脚本之前应该三思而后行。编写适当的Shell脚本一点也不简单,而且充满了陷阱。