web-dev-qa-db-ja.com

シェルスクリプトを使用してリモートMYSQLデータベースにデータを挿入する

私はShell(bash)スクリプトを取得して行をリモートデータベースに挿入しようとしましたが、いくつかの問題がありました:(

このスクリプトは、ファイルをサーバーにアップロードし、URL、HASH、およびファイルサイズを取得し、リモートmysqlデータベースに接続し、既存のテーブルにデータを挿入することを目的としています。リモートMYSQLデータベースビットまで動作しました。

次のようになります。

#!/bin/bash

zxw=randomtext
description=randomtext2

for file in "$@"
 do
 echo -n *****
 ident= *****
 data= ****
 size=` ****
 hash=`****
mysql --Host=randomhost --user=randomuser --password=randompass randomdb
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size');
echo "done"
done

私はプログラミングの完全な初心者なので、ええ:P

とにかく、エラーが発生したため、ブラケットをエスケープするために\を追加しました。現時点では、mysqlデータベースに接続するまでスクリプトは正常に機能しています。 mysqlデータベースに接続するだけで、挿入コマンドは実行しません(bashで挿入コマンドが機能するかどうかさえわかりません)。

PS:コマンドラインから両方のmysqlコマンドを1つずつ試しましたが、ハッシュ/ファイル/サイズを定義し、エスケープする「\」はありませんでしたが、それらは機能しました。

とにかく、皆さんはどう思いますか?何をしようとしているのですか?もしそうならどのように?

助けていただければ幸いです:)

15
lelouch

Insertステートメントは、シェルスクリプトの別の行ではなく、mysqlに送信する必要があるため、「hereドキュメント」にする必要があります。

mysql --Host=randomhost --user=randomuser --password=randompass randomdb << EOF
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size');
EOF

<< EOFは、プログラムへの標準入力として、EOF(先頭に空白がない)のみを含む次の行の前のすべてを取得することを意味します。

29
Paul Tomblin

これは探しているものとは異なる場合がありますが、オプションです。

Shスクリプトにクエリを実際に含めるという煩わしさを回避したい場合は、クエリを.sqlファイルとして保存できます(クエリが非常に大きく複雑な場合に便利です)。これは、使用している言語に関係なく、単純なファイルIOで実行できます。

その後、次のようにsh scripに含めることができます。

mysql -u youruser -p yourpass -h remoteHost < query.sql &

これはバッチモード実行と呼ばれます。オプションで、shスクリプトのその行がブロックされないように、最後にアンパサンドを含めることができます。

また、同じデータが複数回入力され、rdbmsが不整合になることを懸念する場合は、MySqlトランザクション(コミット、ロールバックなど)を調査する必要があります。

11
kmarks2

Bashから生のSQLを使用しないでください。 bashには、データを事前にサニタイズするための適切な機能はありません。 CSVファイルを生成し、代わりにアップロードします。