Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用here文档时bash脚本变量分配_Mysql_Linux_Bash_Eof - Fatal编程技术网

Mysql 使用here文档时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

我对bash/mysql还不熟悉,但是我在阅读示例和其他人的问题时发现了大量的帮助……但我也遇到了自己的问题。 每当一个文件被添加到一个特定的目录中时(为此我使用inotifywait),我都会尝试在MySQL数据库表中插入一行。无论如何,这是我的bash脚本

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