防止在Bash中从源文件执行命令

时间:2015-04-05 14:00:17

标签: bash shell

出于安全考虑,如何防止在source&d;文件中执行命令? 例如:

#!/bin/sh
source file.cfg

通缉:

get="value"

意外:

command

3 个答案:

答案 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'