Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL SQLでshellファイルを作成してしまう技!

とあるテーブルの内容を元にして、SQLで、shellファイルをつくって実行しちゃおうってのを無理やりつくってみました。

テーブル定義

CREATE TABLE `files` (
  `id` int(11) NOT NULL DEFAULT '0',
  `file_name` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;

primary keyはidで、urlは、例えば、"abcdefg.jpg"ってのが入っていたとします。内容的にはこんな感じです

mysql> SELECT * FROM files LIMIT 3;
+----+-----------+
| id | file_name |
+----+-----------+
|  1 | a.jpg     |
|  2 | b.jpg     |
|  3 | c.jpg     |
+----+-----------+

今回、このfile_nameの中にあるファイル名を利用して、

#!/bin/bash
wget http://test.test.local/download/a.jpg
・
・
exit 0

というようなshellファイルを作成してみたいと思います

f:id:hit10231023:20180309104332j:plain f:id:hit10231023:20180308234003p:plain

SQLとヒアドキュメントを駆使する

bashヒアドキュメントについては、ここで書きましたので、詳細はこちらを確認くださいませ

hit.hateblo.jp

wget_create.sh

wget_create.sh なるものを作成しました。

#!/bin/bash

_BASH_FILE="/tmp/bash_sample.sh"

_MYSQL="mysql -N -h localhost -umysqluser -ppassword -Dsample"

echo "#!/bin/bash" > ${_BASH_FILE}

${_MYSQL} << 'EOT' >> ${_BASH_FILE}
SELECT
  CONCAT('http://test.test.local/download/',file_name) AS wget_string   
FROM
  files \G
EOT

echo "exit 0" >>  ${_BASH_FILE}

sed -i '/^\*\*\*/d' ${_BASH_FILE}

chmod 775 ${_BASH_FILE}

bash ${_BASH_FILE}

exit 0

ポイントは、CONCATを利用して文字列結合している部分と、

ここでSQLの結果のみファイル出力していることです

${_MYSQL} << 'EOT' >> ${_BASH_FILE}