2017-02-18 84 views

回答

1

您需要从EOF删除"

#!/bin/bash 
fut=$(date -d "+14 days" +'%Y-%m-%d') 
echo $fut 
mysql -u user -ppassword base1 << EOF 
INSERT INTO tableB SELECT * FROM tableA WHERE startdate < $fut; 
....many lines of MySQL.... 
EOF 

从庆典docs

当 “限制字符串” 被引用或转义无参数替换。

+2

无论何时您将简单的字符串替换为SQL查询,您都会打开注入攻击的可能性。在这种情况下,'$ fut'的值由代码设置,而不是外部源,因此风险可以忽略不计。但总的来说,你应该考虑使用一种语言绑定,它允许你在MySQL层处理参数替换的预处理语句。这包括Perl,Python,Ruby和任何JVM语言。在我看来,与RDBMS交互是一个很好的“时间从bash上升到别的东西”的路标。 –

+2

请注意,这不同于例如Perl,尊重引号的类型:在<< <<“EOF”'内替换,但不在'<< EOF''内。另一方面,壳用*任何*引号关闭替代;即使'<< \ EOF'也有这种效果。 –

1

我在使用here-document时没有问题,但是我想提出另一种稍微冗长的可能性,但是当你可能不得不做更多的变量时,一个函数。

#!/bin/bash 

sql_statement() 
{ 
    local fut=$(date -d "+14 days" +'%Y-%m-%d') 
    echo "INSERT INTO tableB SELECT * FROM tableA WHERE startdate < $fut;" 
    echo "....many lines of MySQL...." 
} 

mysql -u user -ppassword base1 < <(sql_statement) 

这不是在该具体情况下所需,但允许该函数具有附加逻辑(例如if块,循环......),以产生更复杂的或可变的SQL语句。作为一个通用的解决方案,它有很好的优势。

+1

马克里德关于安全性的评论也适用于此,对于理解这一点非常重要。尽管如此,系统必须与外部数据进行交互,因此在堆栈中的某处必须有一个能胜任的程序员来控制或清理所使用的数据,并有一位能够保护系统免受篡改的有能力的管理员(因为最后,如果你不信任你的shell,你的系统实用程序,你的数据库引擎没有受到感染或者错误操作,那么你真的不能完成很多)。 – Fred