Chinaunix首页 | 论坛 | 博客
  • 博客访问: 310805
  • 博文数量: 42
  • 博客积分: 2718
  • 博客等级: 少校
  • 技术积分: 467
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-19 10:23
个人简介

青 田 酒 店 服 务 小 姐 价 格 186-6531-7773

文章分类

全部博文(42)

文章存档

2011年(36)

2010年(6)

分类: LINUX

2011-06-08 12:22:03

同事做的一个web系统,想让别人来提交数据,具体操作就是访问一个URL地址,提交用户名和主机等信息。
而且在这之余,想记下操作的用户ID,因此建议俺搞一个命令行工具来给他用。
  一开始俺想到用system封装CURL,但是这样比较弱智,而且这样做了哪些操作,系统是能够记录下来的,用官方正式一点的话说就是不太安全,有安全隐患,呵呵。
于是乎,下载了curl的源码,生成命令行工具之后,查看curl源码,结合命令行测试,最终目的,就是怎么把
  1. curl --digest -u user:pass url地址
转换成另外一个接口,比如
  1. ./auto_http --auth cme:cme -u jigang.djg -n testhost

这样的,这样做的话,就能够在auto_http的源码中提取uid,IP等等相关信息,而且提交人也不知道我怎么实现提交的,不知道我采用了url,不知道我记录下了他的uid,不知道我们web系统的相关信息。

实现代码如下:

 

  1. //---------auto.c----------created by cme
  2. #include <stdio.h>
  3. #include <stdarg.h>
  4. #include <string.h>
  5. #include <curl/curl.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <sys/types.h>

  9. #define my_setopt(x,y,z) _my_setopt(x, 0, #y, y, z)
  10. #define my_setopt_str(x,y,z) _my_setopt(x, 1, #y, y, z)
  11. static CURLcode _my_setopt(CURL *curl, int str,const char *name, CURLoption tag, ...);
  12. //#define URL ""
  13. #define URL ""
  14. int main(int argc, char *argv[])
  15. {
  16.         CURL *curl;
  17.         CURLcode res;
  18.     
  19.     char strurl[1024] = {0};
  20.     unsigned int uid = getuid();
  21.         if(argc != 7)
  22.         {
  23.             printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
  24.             exit(1);
  25.         }
  26.     
  27.     if (strncmp(argv[1], "--auth", 6) != 0)
  28.     {
  29.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
  30.             exit(1);
  31.     }
  32.     char * str = strchr (argv[2], ':');
  33.     if (!str)
  34.     {
  35.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
  36.             exit(1);

  37.     }
  38.     if (strncmp(argv[3], "-u", 2) != 0)
  39.     {
  40.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
  41.             exit(1);

  42.     }

  43.     if (strncmp(argv[5], "-n", 2) != 0)
  44.     {
  45.         printf("Usage:%s --auth name:pass -u user -n host\n", argv[0]);
  46.             exit(1);

  47.     }


  48.     curl = curl_easy_init();
  49.     if(curl!=NULL)
  50.     {
  51.          my_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
  52.         //my_setopt_str(curl, CURLOPT_USERPWD, "cme:cme");
  53.         my_setopt_str(curl, CURLOPT_USERPWD, argv[2]);
  54.             //my_setopt_str(curl, CURLOPT_PROXYUSERPWD, "cne:cme");
  55.         //curl_easy_setopt(curl, CURLOPT_TLSAUTH_USERNAME, "cme");
  56.         //curl_easy_setopt(curl, CURLOPT_TLSAUTH_PASSWORD, "cme");
  57.         sprintf (strurl, "%suser=%s&host=%s&submitby=%u", URL, argv[4], argv[6], uid);
  58.         printf ("get url:%s\n", strurl);
  59.             curl_easy_setopt(curl, CURLOPT_URL, strurl);
  60.             res = curl_easy_perform(curl);
  61.     }
  62.     return 0;
  63. }
  64. CURLcode _my_setopt(CURL *curl, int str,const char *name, CURLoption tag, ...)
  65. {
  66.   va_list arg;
  67.   CURLcode ret;
  68.   char *bufp;
  69.   char value[256];
  70.   int remark = 0;
  71.   int skip = 0;

  72.   va_start(arg, tag);

  73.   if(tag < CURLOPTTYPE_OBJECTPOINT)
  74.   {
  75.     long lval = va_arg(arg, long);
  76.     snprintf(value, sizeof(value), "%ldL", lval);
  77.     ret = curl_easy_setopt(curl, tag, lval);
  78.     if(!lval)
  79.       skip = 1;
  80.   }
  81.   else if(tag < CURLOPTTYPE_OFF_T)
  82.   {
  83.     void *pval = va_arg(arg, void *);
  84.     unsigned char *ptr = (unsigned char *)pval;

  85.     // function pointers are never printable
  86.     if(tag >= CURLOPTTYPE_FUNCTIONPOINT)
  87.     {
  88.       if(pval)
  89.       {
  90.         strcpy(value, "functionpointer"); // 'value' fits 256 bytes
  91.         remark = 1;
  92.       }
  93.       else
  94.         skip = 1;
  95.     }

  96.     else if(pval && str)
  97.       snprintf(value, sizeof(value), "\"%s\"", (char *)ptr);
  98.     else if(pval)
  99.     {
  100.       strcpy(value, "objectpointer"); // 'value' fits 256 bytes
  101.       remark = 1;
  102.     }
  103.     else
  104.       skip = 1;

  105.     ret = curl_easy_setopt(curl, tag, pval);

  106.   }
  107.   else
  108.   {
  109.     curl_off_t oval = va_arg(arg, curl_off_t);
  110.     snprintf(value, sizeof(value),
  111.              "(curl_off_t)%" CURL_FORMAT_CURL_OFF_T, oval);
  112.     ret = curl_easy_setopt(curl, tag, oval);

  113.     if(!oval)
  114.       skip = 1;
  115.   }

  116.   va_end(arg);

  117.   return ret;
  118. }

总结了下,还是curl的代码写得好,一个operate函数中嵌套了通用的set_opt,甚是好用啊。

简单的几行代码,就实现了。哈哈。

 

附上makefile

 

  1. default:    
  2.     gcc -c -g auto.c
  3.     gcc -o auto_http auto.o -lcurl
  4. clean:
  5.     rm -fr auto_http *.o
阅读(8362) | 评论(10) | 转发(1) |
给主人留下些什么吧!~~

fengyutonglu22011-06-08 12:59:59

顶cme。虽然我看不懂。期待用上cme的网络管理的那个软件

duanjigang2011-06-08 12:59:07

好东东啊, _my_setopt 函数我从源码拔过来的,修改了参数列表和类型定义

axlrose2011-06-08 12:55:26

之前用过curl开发,挺不错的,关注 curl官网,BUG也挺不少

axlrose2011-06-08 12:55:22

之前用过curl开发,挺不错的,关注 curl官网,BUG也挺不少

duanjigang2011-06-08 12:38:56

make file很简单
[code]
default:       
        gcc -c -g auto.c
        gcc -o auto_http auto.o -lcurl
clean:
        rm -fr auto_http *.o
[/code]