出于安全考虑,如何防止在source
&d;文件中执行命令?
例如:
#!/bin/sh
source file.cfg
通缉:
get="value"
意外:
command
答案 0 :(得分:3)
长话短说,你不能。我们可以讨论如何尝试阻止某些命令被执行,但如果安全性是这里的主要问题,source
是不可行的。您正在寻找合适的配置工具 - 而source
旨在执行代码。
例如,以下代码提供了一个简单的键值配置文件解析:
while read -r x; do
declare +x -- "${x}"
done < file.cfg
但这远不是source
给你的灵活性,也远非完全安全的解决方案。它不处理任何特定的转义,多行变量,注释......它也不会过滤分配的变量,因此配置可以覆盖您的宝贵变量。 +x
的额外declare
参数确保配置文件至少不会修改导出到程序的环境。
如果你真的想走这条路,你可以尝试改进这个。但是如果你真的担心安全问题,那么在使用shell脚本之前你应该三思而后行。编写适当的shell脚本根本不是微不足道的,它充满了陷阱。
答案 1 :(得分:2)
您可以使用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
运行它,则条件语句中的可执行命令将被执行。如果您获取文件,则只会导入变量和函数。
答案 2 :(得分:0)
基本的东西可能会起作用:
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'