gpt4 book ai didi

mysql - 使用 here-document 时的 bash 脚本变量分配

转载 作者:太空狗 更新时间:2023-10-29 12:05:40 32 4
gpt4 key购买 nike

我是 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 没有通过 EOF 传递我已经按照这里的指示尝试了http://www.dba-oracle.com/t_access_mysql_with_bash_shell_script.htm

还有这个

Using shell script to insert data into remote MYSQL database

如果我能找到如何将变量传递给查询的任何帮助,我们将不胜感激

最佳答案

在您的示例中,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;不管怎样,你都会执行这个邪恶的命令!一种可能性是使用 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

编辑。

在评论中回答你的问题:

why did the script properly echo $filename to my terminal but not send it properly to MySQL, does that have to do with string starting with a space? or something else completely?

那是因为当你做类似的事情时:

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设置为空字符串,然后以filename为环境变量执行命令inotifywait ... (但是 inotifywait 并不关心它)。 这就是您在终端上看到的内容! 这是此命令的输出。然后你可能看到了一个空行,那是

的输出
echo $filename

相当于

echo

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

希望这对您有所帮助。

关于mysql - 使用 here-document 时的 bash 脚本变量分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13893083/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com