在您的示例中,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 ...
并不真正关心它)。这就是你在终端上看到的!这是这个命令的输出。然后你可能会看到一个空行,那是filename
inotifywait
echo $filename
这相当于
echo
因为变量filename
扩展为空字符串。
希望这可以帮助。