我在我的系统上运行鱿鱼代理服务器与局域网上的朋友共享互联网连接。 我只是想logging/var/log/squid/access.log文件的数据到MySQL数据库,只要我的脚本检测到日志文件中的受限制的IP地址。 怎么做? 有没有可能从shell脚本连接到databse?
您可以简单地使用CLI MySQL MySQL客户端来查询或操作您的数据库。
你可以做类似的事情
echo "insert into squidlog (time) values (now());" | mysql -u log -ploguserpassword log_db
我不是一个大的shell脚本,但你明白了。 我相信有一些奇特的操作,你可以在那里得到所有的相关信息(如IP地址)。
您可以使用mysql CLI命令使用…
mysql -hhostname -uusername -p'password' -e'select some sql here;'
您的脚本使用哪种语言?
在Perl中,fe,你绝对可以查询一个数据库。
如果你使用Bash(或者其他的shell脚本),你不能直接使用; 你将不得不依靠可以完成这个工作的命令行工具(比如MySql客户端工具)来parsing它们的输出。
除了上面的答案之外,这个表格可能会更有说服力:
mysql -h hostname -u username -p 'password' <<- _END_ | grep something insert into....; select * from....; _END_
我添加了| grep something | grep something只是为了告诉你输出pipe道的选项。 如果您不需要处理您正在使用的SQL的输出,则是明智之举。 你可能可以把整个东西包装在一个myvariable=$(....) ,而不需要使用另一个脚本来处理输出。 这是一个here文件的例子。 请注意,这是未经testing的。
一个更优雅的select:
一个更好的方法来做你可能做的事情,把日志数据直接pipe理到脚本,而不是处理日志文件。 这会给你实时的数据,你不需要担心设置一个cron作业来间隔地检查文件的变化。
这种方法的一个例子是:
LogFile Path/To/Log/In/Your/Configuration
至
LogFile |/usr/local/custom_script_you_made_to_process_the_data
注意path开始处的pipe道。 这会将输出直接写入脚本,而不是将其写入日志文件。 就我个人而言,我会使用这个pipe道方法,然后使用perl脚本来提取和格式化数据,然后使用Perl`DBI :: mysql'包将其发送到MySQL。 如果您仍然需要其他数据,则可以将其附加到原始日志文件中。
请注意,对于第二种方法的脚本来说,发送的数据似乎来自STDIN(标准input),就像某人input了数据,或者将文件传送到了脚本中。
只是我自己的谦虚的评论,如果你想这样做只在shell ….当我第一次开始,我想要做的一切与Bash。 虽然shell非常棒,但是我发现把自己仅限于Bash,实际上是让我跳过荒谬的箍环来完成一些任务。 一旦我将Perl添加到我的脚本中,并在两者之间来回跳动,以利用每一个擅长的东西,我节省了很多时间,并发现我的解决scheme更加优雅和干净。 在那个时候,我转换到使用最好的工具工作,而不是试图使用相同的工具,因为所有的问题,Linux的工作非常好,因为壳牌在不同语言的不同脚本之间使用一个惊人的多function和易于使用的胶水。