2

我是 bash /mysql 的新手,但是我在阅读抛出的示例和其他人的问题时找到了很多帮助……但是遇到了我自己的问题。每次将文件添加到特定目录时,我都尝试在 MySQL 数据库表中插入一行(为此我正在使用 inotifywait )无论如何这是我的 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

由此我已经用 echo 验证了变量$filename是否正确保存在 bash 脚本的末尾,但是当我查看表中的条目时, url_video 列具有它的默认值,而不是由$filename

从我可以得出的结论来看,变量$filename 没有通过 EOF 我已经尝试过,如这里所示http://www.dba-oracle.com/t_access_mysql_with_bash_shell_script.htm

还有这个

使用 shell 脚本将数据插入远程 MYSQL 数据库

非常感谢我在哪里可以找到如何将变量传递给查询的任何帮助

4

1 回答 1

3

在您的示例中,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,您将执行邪恶命令!一种可能性是使用以下方法清理文件名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= "false"
$ echo "$filename"

$

发生的情况是环境变量filename设置为空字符串,然后false使用该环境变量启动命令(恰好存在),我们就完成了。

当你这样做时:

filename= inotifywait --format "%f" -e create /var/www/media2net/torrent

该变量filename设置为空字符串,然后将命令作为环境变量执行(但inotifywait ...并不真正关心它)。这就是你在终端上看到的!这是这个命令的输出。然后你可能会看到一个空行,那是filenameinotifywait

echo $filename

这相当于

echo

因为变量filename扩展为空字符串。

希望这可以帮助。

于 2012-12-15T14:47:03.747 回答