我想下载一个文件(仅当url以某个字符串结尾时才下载),该URL位于MySQL数据库中,提取文本并将文本写入数据库,通过替换url。
并且必须对每一行(大约 25k 行)执行此操作。
有没有办法用 bash 脚本(或其他脚本,例如 Java)来做到这一点?
MySQL 服务器在我的 Linux 根目录上运行,我可以完全访问它。我的桌面操作系统也是linux(Linux Mint,有很多定制功能)。
这是我到目前为止所做的:
#!/bin/bash
for (( i=1; i <= 5; i++))
do
DBQUERY=`mysql -B -ss -uuser -ppassword -e "USE table; SELECT column FROM table WHERE pid='$i';"`
if [[ $DBQUERY == *.pls ]] ;
then
wget -O tempfile.pls $DBQUERY
while read line
do
if [[ $line == File1=* ]] ;
then
mysql -B -ss -uuser -ppassword -e "USE table; UPDATE table SET column = '${line:6}' WHERE pid = '$i';"
fi
done <tempfile.pls
fi
done
我怎样才能保证它的安全?
答案1
为了安全起见,您必须查看生成的代码是否可以注入。
在此命令中mysql -B -ss -uuser -ppassword -e "USE table; SELECT column FROM table WHERE pid='$i';"
,您知道 i 是 1 到 5 之间的数字,所以没问题。
但在该命令中mysql -B -ss -uuser -ppassword -e "USE table; UPDATE table SET column = '${line:6}' WHERE pid = '$i';"
,您无法确定 ${line:6};你可以想象它包含一个单引号,在这种情况下你必须用两个单引号替换,你还可以检查长度是否小于数据库中列的长度(假设这里是255)或截断数据,然后再替换引号。
#!/bin/bash
for (( i=1; i <= 5; i++))
do
DBQUERY=`mysql -B -ss -uuser -ppassword -e "USE table; SELECT column FROM table WHERE pid='$i';"`
if [[ $DBQUERY == *.pls ]] ;
then
wget -O tempfile.pls $DBQUERY
while read line
do
if [[ $line == File1=* ]] ;
then
str=${line:6:255}
str=${str//\'/''}
mysql -B -ss -uuser -ppassword -e "USE table; UPDATE table SET column = '$str' WHERE pid = '$i';"
fi
done <tempfile.pls
fi
done