[英]Prevent a command being executed from a source'd file in Bash
为了安全起见,如何防止source
d文件中的命令被执行? 例如:
#!/bin/sh
source file.cfg
通缉:
get="value"
意外的:
command
长话短说,你不能。 我们可以辩论如何尝试阻止执行某些命令,但是如果安全是此处的主要考虑因素,那么source
是不可行的。 您正在寻找一种适当的配置工具,而source
是用来执行代码的 。
例如,以下代码提供了简单的键值配置文件解析:
while read -r x; do
declare +x -- "${x}"
done < file.cfg
但这既不是灵活性source
提供的,也不是完全安全的解决方案。 它不处理任何特定的转义,多行变量,注释…,并且也不过滤分配的变量,因此配置可以覆盖您的宝贵变量。 要declare
的额外+x
参数可确保配置文件至少不会修改导出到程序的环境。
如果您确实想走这条路,则可以尝试改善这一点。 但是,如果您真的担心安全性,那么在使用shell脚本之前应该三思而后行。 编写适当的Shell脚本一点也不简单,而且充满了陷阱。
您可以使用类似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
如果您使用chmod +x
文件并运行它,或者通过bash file.sh
运行它, bash file.sh
执行条件语句中的可执行命令。 如果您提供文件源,则只会导入变量和函数。
一些基本的方法可能会起作用:
name="$(sed -n 1p < source_file | grep -o 'name="[^"]*' | grep -o '[^"]*$')"
lastname="$(sed -n 2p < source_file | grep -o 'lastname="[^"]*' | grep -o '[^"]*$')"
age="$(sed -n 3p < source_file | grep -o 'age="[^"]*' | grep -o '[^"]*$')"
接下来,检查参数是否符合某些标准,例如,是否与数据库名称( $LIST_NAMES
)相匹配,或者您是否具有一定数量的字符串,等等。
if ! grep -Fox "$name" <<<"$LIST_NAMES"; then exit 1; fi
if [ $(wc -c <<<"$age") -gt 3 ]; then exit 1; fi
然后只采取有用的行,以防止其余部分。
head -n3 < source_file > source_file.tmp
source 'source_file.tmp'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.