あなたの例でfilename
は、空の文字列に設定されています(=
記号の後のスペースに注意してください!)。あなたが必要
filename=$(inotifywait --format "%f" -e create /var/www/media2net/torrent)
同様に、
date_field=$(date +"%F:%T")
コマンドにタイプミスがあることに注意してくださいmysql
(date_field
および注date_feild
):
mysql --host=localhost --user=root --password=admin Media2net <<EOF
insert into video (title, description, url_video, upload_date)
values('testing','default_description','$filename', '$date_field');
EOF
ファイル名を制御していることを願っています。などの一重引用符を含むファイル名を想像してみてくださいhello'howdy
。クエリに問題があります。さらに悪いことに、悪意のあるユーザーが という名前のファイルを配置するとwhatever','something'); evil_mysql_command; whatever
、悪意のあるコマンドが実行されます。1 つの可能性は、次のように使用してファイル名をサニタイズするprintf
ことです。
printf -v filename '%q' "$(inotifywait --format "%f" -e create /var/www/media2net/torrent)"
これにより、少なくともファイル名に表示される可能性のある単一引用符がエスケープされます。Gordon Davisson のコメントを参照してください。このprintf
トリックでは、考えられるすべての攻撃を防ぐことはできません。そのため、ファイルの名前を完全に制御してください。
これらすべての提案により、次のスクリプトが生成されます。
#!/bin/bash
while true; do
printf -v filename '%q' "$(inotifywait --format "%f" -e create /var/www/media2net/torrent)"
date_field=$(date +"%F:%T")
mysql --host=localhost --user=root --password=admin Media2net <<EOF
insert into video (title, description, url_video, upload_date)
values('testing','default_description','$filename', '$date_field');
EOF
echo "$filename"
done
編集。
コメントで質問に答えるには:
スクリプトが端末に正しくエコー$filename
されたのに、MySQL に正しく送信されなかったのはなぜですか。これは、スペースで始まる文字列と関係がありますか? または完全に何か他のもの?
それは、次のようなことをするときです。
whatever= command
次に、変数whatever
が空の文字列に設定され、コマンドcommand
が実行されます (whatever
変数は環境変数として設定されます)。例えば、
$ IFS='c' read a b c <<< "AcBcC"
$ echo "$a $b $c"
A B C
$ echo $IFS
$
あなたのスクリプトでは、変数 filename は実際にはグローバルに設定されていませんでした。これを行うことで確認できます:
$ filename= "false"
$ echo "$filename"
$
何が起こるかというと、環境変数filename
が空の文字列に設定され、false
その環境変数を使用してコマンド (たまたま存在する) が起動され、完了です。
これを行う場合:
filename= inotifywait --format "%f" -e create /var/www/media2net/torrent
変数filename
は空の文字列に設定され、コマンドは環境変数としてinotifywait ...
実行されます (ただし、実際には気にしません)。そして、それがあなたの端末で見たものです! それはこのコマンドの出力でした。次に、おそらく空の行が表示されました。これは次の出力ですfilename
inotifywait
echo $filename
と同等でした
echo
変数filename
が空の文字列に展開されるためです。
お役に立てれば。