Baixar arquivo vinculado no banco de dados MySQL, extrair texto e inserir em db com o script bash?

2

Eu quero baixar um arquivo (só baixar se a url terminar com uma certa string), qual URL está em um banco de dados MySQL, extrair o texto e escrever o texto no banco de dados, substituindo o url.
E isso tem que ser feito para cada linha (aprox. 25k linhas).

Existe uma maneira de fazer isso com um script bash (ou outra coisa, por exemplo, Java)?

O servidor MySQL é executado no meu root linux, eu tenho acesso total a ele. Meu sistema operacional é também linux (Linux Mint com muitas customizações).

Isso é o que eu fiz até agora:

#!/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

Como posso protegê-lo?

    
por Leandros 28.09.2012 / 18:32

1 resposta

1

Para ser seguro, você tem que olhar para o gerado, se o código pode ser injetado.

Neste comando mysql -B -ss -uuser -ppassword -e "USE table; SELECT column FROM table WHERE pid='$i';" , você sabe que eu sou um número entre 1 e 5, então tudo bem.

Mas nesse comando mysql -B -ss -uuser -ppassword -e "USE table; UPDATE table SET column = '${line:6}' WHERE pid = '$i';" , você não pode ter certeza de $ {line: 6}; você pode imaginar que ele contém uma aspa simples, neste caso você tem que substituir por duas aspas simples, você também pode verificar se o comprimento é menor que o comprimento da coluna no banco de dados (suponha aqui 255) ou truncar os dados antes de substituir citações.

#!/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
    
por 30.09.2012 / 15:34