免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1868 | 回复: 7
打印 上一主题 下一主题

shell与mysql,iptables的编写问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-24 15:14 |只看该作者 |倒序浏览
在mysql下有一个表ipform,里面有2个字段ipaddr和flag。
ipaddr存放ip,flag表示该对该ip的动作,1--ACCEPT,0--DROP
现在想用shell写一个程序对这个表不停的扫描,
对里面flag为1的ip执行iptables -I INPUT -s $ip -j ACCEPT 后就把该项记录从表中删除
对flag为0的ip执行iptables -I INPUT -s $ip -j DROP 后也把该记录从表中删掉
不停的扫描表数据,当有数据时执行上面两个操作
请问这个脚本怎么写好,望给个参考,谢谢!

论坛徽章:
0
2 [报告]
发表于 2003-05-25 03:58 |只看该作者

shell与mysql,iptables的编写问题

...

...

这个问题应该是很好解决的,但是你得说明一下从 mysql 倒出的表的的格式,有无表格线和其它多余的行,才能对数据进行处理。

光用文字说明不够,最好有具体的例子,这样别人看得比较明白,就比较容易快地得到回复。

论坛徽章:
0
3 [报告]
发表于 2003-05-25 22:22 |只看该作者

shell与mysql,iptables的编写问题

我用C遍了个显示数据库记录的代码,如下

  1. #include </usr/local/mysql/include/mysql/mysql.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. main(){
  5.    MYSQL *conn;
  6.    MYSQL_RES *result;
  7.    MYSQL_ROW row;
  8.    char query[200];
  9.    char query1[200];
  10.    char opip[200];
  11.    
  12.    if((conn = mysql_init(NULL))==NULL){
  13.       fprintf(stderr,"mysql_init() error:%s\n",mysql_error(conn));
  14.       exit(1);
  15.    }

  16.    

  17. if(mysql_real_connect(conn,"127.0.0.1","root","","web_db",0

  18. ,NULL,0)==NULL){
  19.       fprintf(stderr,"mysql_real_connect()

  20. error:%s\n",mysql_error(conn));
  21.       exit(1);
  22.    }

  23.    sprintf(query,"select * from ipinfo");
  24.       
  25.    if( mysql_query(conn,query)!=0|| !(result =

  26. mysql_store_result(conn)) ){
  27.       fprintf(stderr,"query error\n");
  28.       return -1;
  29.    }
  30.    
  31.    while((row = mysql_fetch_row(result))!=NULL)
  32. {
  33.         //printf("%s %s\n",row[0],row[1]);
  34.      if(row[1]==0)
  35.   {        sprintf(opip,"/sbin/iptables -I INPUT -s %s -j

  36. DROP",row[0]);
  37.         system(opip);
  38.         sprintf(query1,"delete from ipinfo where

  39. ipaddr='%s'",row[0]);
  40.         mysql_query(conn,query1);
  41.    }
  42.    else
  43.    {     sprintf(opip,"/sbin/iptables -I INPUT -s %s -j

  44. ACCEPT",row[0]);
  45.         system(opip);
  46.         sprintf(query1,"delete from ipinfo where

  47. ipaddr='%s'",row[0]);
  48.         mysql_query(conn,query1);  
  49.    }
  50. }   
  51.    mysql_free_result(result);
  52.    mysql_close(conn);

  53. }
复制代码


printf("%s %s\n",row[0],row[1])的一个结果是
  1. 192.168.0.2 0
复制代码


我没有加上无限循环的查询,这样会使我的CUP达到100%以上
并且这个程序还有点问题,就在 if(row[1]==0)这个对flag的判断上
我本来的意思是想用SHELL写个和它一样的功能,能给PHP网页调用它
听说PHP网页可以把它的变量post给sh,但sh要执行sbin里面的命令可能也要root的吧,让我头疼啊!
我的环境是RH8,在做个防火墙记费系统,扫描数据库的方法是个笨方法啊!因为老师要求编程实现,不好用别的软件了。
红袖姐姐,大家帮帮想想啊,拜托了!

论坛徽章:
0
4 [报告]
发表于 2003-05-26 01:13 |只看该作者

shell与mysql,iptables的编写问题

...

用 shell 来解决你的问题并不难的,而且不一定/sbin下面的程序就定要root身份,比如 /sbin/ping 。

  1. #!/bin/sh

  2. DB='your_database'
  3. PASSWD='your_password'

  4. echo "select * from ipform ; " | mysql -s  -p$PASSWD $DB | while read ip flag; do
  5.     [ $flag -eq 0 ] && act="ACCEPT" || act="DROP"
  6.     iptables -I INPUT -s $ip -j $act && echo " delete from ipform
  7.                 where ipaddr = '$ip' and flag = $flag ; " | mysql -s  -p$PASSWD $DB
  8. done
复制代码


这个是一次循环,如果要不断地扫描的话,可以把它放到 crontab 中

论坛徽章:
0
5 [报告]
发表于 2003-05-26 17:06 |只看该作者

shell与mysql,iptables的编写问题

谢谢红袖姐姐的帮忙!
但让这个程序循环在contab怎么设置哦?要设置分,时,日期的!写0还是什么?
还有要是每2秒就自动运行一次,也没找到有秒的设置啊?

论坛徽章:
0
6 [报告]
发表于 2003-05-26 17:18 |只看该作者

shell与mysql,iptables的编写问题

那就用
while [ 1 ]
do
你的shell
sleep 2
done
这样怎样?

论坛徽章:
0
7 [报告]
发表于 2003-05-26 21:06 |只看该作者

shell与mysql,iptables的编写问题

呵呵,搞定了
谢谢你们
我越来越喜欢shell了,但是有点难懂:)

论坛徽章:
0
8 [报告]
发表于 2003-05-26 21:13 |只看该作者

shell与mysql,iptables的编写问题

原帖由 "poplandy" 发表:
呵呵,搞定了
谢谢你们
我越来越喜欢shell了,但是有点难懂:)


不会啦,肯定比 C 好懂,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP