下载 MySQL DB 中链接的文件,提取文本并使用 bash 脚本插入到数据库中?

下载 MySQL DB 中链接的文件,提取文本并使用 bash 脚本插入到数据库中?

我想下载一个文件(仅当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

相关内容