如何从 shell 脚本连接到 mysql 数据库?可能吗?

如何从 shell 脚本连接到 mysql 数据库?可能吗?

我在系统上运行 squid 代理服务器,以便与 LAN 上的朋友共享互联网连接。每当我的脚本在日志文件中检测到受限 IP 地址时,我只想将数据从 /var/log/squid/access.log 文件记录到 mysql 数据库。如何操作?是否可以通过 shell 脚本连接到数据库?

答案1

您可以简单地使用 CLI MySQL 客户端mysql来查询或操作数据库。

答案2

你可以做类似的事情

echo "insert into squidlog (time) values (now());" | mysql -u log -ploguserpassword log_db

我不是 shell 脚本方面的专家,但你明白我的意思。我相信通过一些巧妙的操作,你也可以在其中获取所有相关信息(如 IP 地址)。

答案3

您可以使用 mysql CLI 命令...

mysql -hhostname -uusername -p'password' -e'select some sql here;'

答案4

除了上述答案之外,这种形式可能更方便:

mysql -h hostname -u username -p 'password' <<- _END_ | grep something
insert into....;
select * from....;
_END_

我添加它| grep something只是为了向您展示管道输出的选项。如果您不需要处理正在使用的 SQL 的输出,则它是不必要的。您可能可以将整个东西包装在一个中,以便myvariable=$(....)在本地处理输出,而无需使用另一个脚本。这是一个示例这里的文件。请注意,这尚未经过测试。


一个更优雅的选择:

更优雅的方法是直接将日志数据传送到脚本,而不是处理日志文件。这样可以为您提供实时数据,您无需担心设置 cron 作业来定期检查文件是否发生变化。

此方法的一个例子是:

LogFile Path/To/Log/In/Your/Configuration

LogFile |/usr/local/custom_script_you_made_to_process_the_data

注意路径开头的管道。这会将输出直接写入脚本,而不是将其放入日志文件中。我个人会使用这种管道方法,然后使用 perl 脚本提取和格式化数据,然后使用 Perl `DBI::mysql' 包将其发送到 mysql。如果您仍然需要其他数据,则可以将其附加到原始日志文件中。

请注意,对于使用第二种方法的脚本,发送的数据似乎来自 STDIN(标准输入),就像有人输入的一样,或者您将文件通过管道传输到脚本中。


如果你只想在.... 刚开始的时候,我想用 Bash 做所有事情。虽然 shell 非常棒,但我发现,只使用 Bash 实际上让我在完成某些任务时遇到了很多麻烦。一旦我将 Perl 添加到我的脚本中,并在两者之间来回切换以利用各自的优势,我就会节省很多时间,并发现我的解决方案更加优雅和简洁。那时,我开始转向使用最适合工作的工具,而不是尝试使用相同的工具来解决所有问题,这在 Linux 上非常有效,因为使不同语言的不同脚本之间成为一种用途广泛且易于使用的粘合剂。

相关内容