Mysql 使用here文档时bash脚本变量分配
我对bash/mysql还不熟悉,但是我在阅读示例和其他人的问题时发现了大量的帮助……但我也遇到了自己的问题。 每当一个文件被添加到一个特定的目录中时(为此我使用inotifywait),我都会尝试在MySQL数据库表中插入一行。无论如何,这是我的bash脚本Mysql 使用here文档时bash脚本变量分配,mysql,linux,bash,eof,Mysql,Linux,Bash,Eof,我对bash/mysql还不熟悉,但是我在阅读示例和其他人的问题时发现了大量的帮助……但我也遇到了自己的问题。 每当一个文件被添加到一个特定的目录中时(为此我使用inotifywait),我都会尝试在MySQL数据库表中插入一行。无论如何,这是我的bash脚本 #!/bin/bash while true; do filename= "false" filename= inotifywait --format "%f" -e create /var/www/me
#!/bin/bash
while true; do
filename= "false"
filename= 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_feild');
EOF
echo $filename
done
#/bin/bash
虽然真实;做
filename=“false”
filename=inotifywait--格式“%f”-e create/var/www/media2net/torrent
日期\字段=日期+%F:“%T”
mysql--host=localhost--user=root--password=admin Media2net在您的示例中,filename
被设置为空字符串(注意=
符号后面的空格!)。你需要
filename=$(inotifywait --format "%f" -e create /var/www/media2net/torrent)
同样地
date_field=$(date +"%F:%T")
请注意,您的mysql
命令中有一个输入错误(date\u字段
和注意date\u字段
):
这至少会转义文件名中可能出现的单引号。请参阅Gordon Davidson的评论: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
然后将变量which
设置为空字符串,并执行命令command
(将which
变量设置为环境变量)。例如:
发生的情况是,环境变量filename
设置为空字符串,然后使用该环境变量启动命令false
(该命令恰好存在),我们就完成了
执行此操作时:
filename= inotifywait --format "%f" -e create /var/www/media2net/torrent
变量filename
设置为空字符串,然后执行命令inotifywait…
,将filename
作为环境变量(但inotifywait
并不真正关心它)。这就是你在终端上看到的!这是这个命令的输出。然后你可能看到一个空行,那是
echo $filename
这相当于
echo
因为变量filename
扩展为空字符串
希望这有帮助。ahhh,非常感谢!你对文件名的建议奏效了!!!为了满足我自己的好奇心,为什么脚本正确地将$filename回显到我的终端,但没有正确地将其发送到MySQL,这与以空格开头的字符串有关吗?或者完全是别的什么?我还没走那么远不!虽然我意识到某种性质的问题是一个问题,但你知道web上有任何引用详细说明了这种性质的问题吗?通过文件名进行SQL注入很好,但请注意printf…'%如果这种类型的攻击是一个可能的问题,那么q'
实际上是不够的。它确实有bash风格的字符串引用/转义,而mysql有一些不同的引用规则,攻击者可以利用这种差异。正确防御SQL注入是很困难的。另外,printf-v行在ubuntu 12.04中返回一个非法选项,尽管文档表明语法是正确的?无论如何,我将阅读有关防止SQL注入的内容,正如Gordon明确指出的,有多个步骤involved@brendanmorrison确保您正在运行bash
,而不是sh
。-v
选项仅适用于printf
bash内置。在=
周围不能有空格。此命令将环境变量“filename”临时设置为空字符串,然后执行名为“false”的程序。
$ IFS='c' read a b c <<< "AcBcC"
$ echo "$a $b $c"
A B C
$ echo $IFS
$
$ filename= "false"
$ echo "$filename"
$
filename= inotifywait --format "%f" -e create /var/www/media2net/torrent
echo $filename
echo