存档

文章标签 ‘开源’

Httpry:简明http抓包工具

2017年7月27日 没有评论

tcpdump是流量分析时最常用的抓包工具,功能很强大。抓取http get交互消息的常用命令是:

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -w eth0-http.pcap

通常我们会把抓取的http包保存成文件,然后用wireshark打开分析。

有时候,我们不需要对流量观察得特别深入,仅仅是看一下有什么样的流量,不需要存盘分析。

使用tcpdump的话输出内容不直观,比如wget http://www.baidu.com/的输出如下:

15:05:27.837705 00:16:3e:04:af:53 > ee:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 165: (tos 0x0, ttl 64, id 18764, offset 0, flags [DF], proto TCP (6), length 151)
139.129.205.48.53353 > 220.181.112.244.80: Flags [P.], cksum 0xa6e5 (incorrect -> 0xe0b0), seq 2930938556:2930938667, ack 65362085, win 115, length 111
0x0000: 4500 0097 494c 4000 4006 4ab9 8b81 cd30 E…IL@.@.J….0
0x0010: dcb5 70f4 d069 0050 aeb2 92bc 03e5 58a5 ..p..i.P……X.
0x0020: 5018 0073 a6e5 0000 4745 5420 2f20 4854 P..s….GET./.HT
0x0030: 5450 2f31 2e30 0d0a 5573 6572 2d41 6765 TP/1.0..User-Age
0x0040: 6e74 3a20 5767 6574 2f31 2e31 3220 286c nt:.Wget/1.12.(l
0x0050: 696e 7578 2d67 6e75 290d 0a41 6363 6570 inux-gnu)..Accep
0x0060: 743a 202a 2f2a 0d0a 486f 7374 3a20 7777 t:.*/*..Host:.ww
0x0070: 772e 6261 6964 752e 636f 6d0d 0a43 6f6e w.baidu.com..Con
0x0080: 6e65 6374 696f 6e3a 204b 6565 702d 416c nection:.Keep-Al
0x0090: 6976 650d 0a0d 0a ive….
15:05:27.860678 ee:ff:ff:ff:ff:ff > 00:16:3e:04:af:53, ethertype IPv4 (0x0800), length 449: (tos 0x60, ttl 48, id 47418, offset 0, flags [DF], proto TCP (6), length 435)
220.181.112.244.80 > 139.129.205.48.53353: Flags [P.], cksum 0x6a94 (correct), seq 65362085:65362480, ack 2930938667, win 772, length 395
0x0000: 4560 01b3 b93a 4000 3006 e94e dcb5 70f4 E`…:@.0..N..p.
0x0010: 8b81 cd30 0050 d069 03e5 58a5 aeb2 932b …0.P.i..X….+
0x0020: 5018 0304 6a94 0000 4854 5450 2f31 2e31 P…j…HTTP/1.1
0x0030: 2032 3030 204f 4b0d 0a53 6572 7665 723a .200.OK..Server:
0x0040: 2062 6665 2f31 2e30 2e38 2e31 380d 0a44 .bfe/1.0.8.18..D
0x0050: 6174 653a 2054 6875 2c20 3237 204a 756c ate:.Thu,.27.Jul
0x0060: 2032 3031 3720 3037 3a30 353a 3237 2047 .2017.07:05:27.G
0x0070: 4d54 0d0a 436f 6e74 656e 742d 5479 7065 MT..Content-Type
0x0080: 3a20 7465 7874 2f68 746d 6c0d 0a43 6f6e :.text/html..Con
0x0090: 7465 6e74 2d4c 656e 6774 683a 2032 3338 tent-Length:.238

此时,httpry是一个很好的替代工具。使用httpry捕获上述请求,输出如下:

2017-07-27 15:08:50 139.129.205.48 220.181.112.244 > GET www.baidu.com / HTTP/1.0 – –
2017-07-27 15:08:50 220.181.112.244 139.129.205.48 < – – – HTTP/1.1 200 OK

简单明了。

  • 安装
    • 下载源码,make && make install就ok了
    • 这个程序依赖libpcap-devel库,没有的话就yum install -y libpcap-devel
  • 使用
    • 最简单的:httpry -i eth0
    • 支持过滤http请求方法:httpry -i eth0 -m GET
    • 支持保存抓包:httpry -i eth0 -o eth0-http.log
    • 可以指定packet filter:httpry -i eth0 ‘dst host www.baidu.com’
分类: 工具 标签: , , ,

wtail:可以多屏输出的多文件跟踪查看工具

2017年5月17日 没有评论

tail是我们常用到的文件跟踪查看工具,-n可以查看末尾n行,-f可以实时跟踪文件(描述符)的最新变化。当然也可以同时查看多个文件,但是多文件的输出是混杂在一起的,没那么直观。

现在好了,我们有了wtail。这是一个可以在同一个终端窗口中同时输出多个被跟踪文件数据的工具,每个文件可以在单独的小屏幕中输出,即一个窗口分屏输出。

  1. 安装
    • wtail依赖libncurses,某些机器上可能没有这个库,需要手动安装:

      wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.0.tar.gz

      tar xzvf ncurses-6.0.tar.gz && cd ncurses-6.0

      ./configure && make && make install

    • 下载wtail源码包,解压,make && make install
  2. 使用
    • wtail *.log
分类: Shell, 工具, 运维 标签: , ,

libcurl使用注记

2015年10月23日 没有评论

libcurl是一个开源的用户端URL传输工具,可以用来向服务器下载或提交数据,支持诸多协议:DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP.通常用来做http的传输。下面介绍c api的用法及注意事项。

  1. 库的编译
  2. 使用方法
    • 初始化
    • 设置选项
    • 同步和异步传输
  3. 通过Get下载一个文件
  4. 通过Post提交数据
  5. 下载限速
    • CURLOPT_MAX_RECV_SPEED_LARGE
  6. curl_easy_perform阻塞问题
    • 使用异步接口
    • 超时机制
  7. 超时参数可能引起SIGSEGV
    • 关闭信号:curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1)
分类: 资料 标签: , ,

redis rdb方式存盘需要注意的事

2015年10月8日 没有评论

redis有两种方法进行数据存盘:rdb和aof,这里主要说的是rdb方式。

rdb就是redis内存的一个快照文件,可配置redis满足特定的条件时自动进行快照。默认配置如下:

save 900 1
save 300 10
save 60 10000

redis有两个命令来执行存盘:save和bgsave。

save是同步的,执行时会阻断redis对其他命令的执行,当数据操作频繁时,redis会变得暂时不可用。不建议采取这个命令。

bgsave是异步的,通过fork的方式生成一个子进程,子进程会将父进程的内存数据拷贝一份,并将这些数据写到硬盘上。

bgsave不会影响主进程的运行,但是如果redis在内存中存储了大量数据,子进程的出现会导致redis对内存的需求翻倍,如果此时内存不足,子进程可能fork失败,从而导致存盘失败!

一个可行的解决方法是修改系统参数overcommit_memory,将其设置为1.

  echo 1 > /proc/sys/vm/overcommit_memory

这样可避免fork失败的情况。

分类: Redis, 开发, 数据库 标签: ,

Hiredis: redis c client使用注记

2015年9月17日 没有评论
  1. 编译
  2. 使用
    • 初始化
    • 连接redis数据库

      redisContext * pConn = redisConnect(redisIp.c_str(), redisPort);
      if (m_cLocal == NULL)
      {
      return 1;
      }

      if(pConn->err)
      {
      cout << “Connection to redis[” << redisIp << “] error: ” << pConn->errstr;
      redisFree(pConn);
      return 2;
      }

    • 执行命令

      string cmd=”set foo bar;
      redisReply * reply=(redisReply *)redisCommand(pConn, cmd.c_str());
      if(reply == NULL)
      {
      cout << “redis[” << redisIp << “] excute ” << cmd << ” failed, error is: ” << pConn->errstr;
      redisFree(pConn);
      pConn=NULL;
      return 3;
      }
      freeReplyObject(reply);

    • 解析结果
      • 不同的命令返回不同类型的结果,需要根据reply->type字段进行解析
      • reply->type主要有以下6种,可嵌套,比如array类型的结构中包含指向其他array的指针

        #define REDIS_REPLY_STRING 1
        #define REDIS_REPLY_ARRAY 2
        #define REDIS_REPLY_INTEGER 3
        #define REDIS_REPLY_NIL 4
        #define REDIS_REPLY_STATUS 5
        #define REDIS_REPLY_ERROR 6

      • 由于返回结果通过指针来引用,操作时需要格外小心
  3. 注意事项
  • Once an error is returned the context cannot be reused and you should set up a new connection.

上面示例中执行命令时,如果返回了错误,则连接不可用,需要重新建立连接。

  • redisCommand这个函数的用法应参照c中的printf。上面示例中,如果cmd中含%,特别要引起注意!
分类: C/C++, Redis, 数据库, 资料 标签: , , , ,

MongoDB c++驱动安装与使用

2015年9月15日 1 条评论
  1. 安装
    • 获取源码:git clone https://github.com/mongodb/mongo-cxx-driver.git,解压
    • 安装编译工具scons:yum install -y scons
    • 编译:进入mongo-cxx-driver目录,执行:scons –prefix=/home/work/mongo/ –sharedclient install
    • 驱动已被安装在/home/work/mongo中
  2. 使用
    • 编译示例程序
      #include <cstdlib>
      #include <iostream>
      #include "mongo/client/dbclient.h" // for the driver
      
      void run() {
        mongo::DBClientConnection c;
        c.connect("localhost");
      }
      
      int main() {
          mongo::client::initialize();
          try {
              run();
              std::cout << "connected ok" << std::endl;
          } catch( const mongo::DBException &e ) {
              std::cout << "caught " << e.what() << std::endl;
          }
          return EXIT_SUCCESS;
      }
    • gcc tutorial.cpp -I./mongo/include -L./lib/ -L./mongo/lib -lmongoclient -Wl,-rpath=./lib/ -o tutorial
    • 上面的编译选项中,mongo、lib与tutorial.cpp位于同一目录,mongo即是第一步中指定的安装目录,lib存放其他依赖库,如boost。
    • 向数据库插入文档

      using mongo::BSONElement;
      using mongo::BSONObj;
      using mongo::BSONObjBuilder;

      BSONObjBuilder b;
      b.append(“Name”, “Liuyj”);
      b.append(“Age”, 30);
      BSONObj p = b.obj();

      try
      {
          c.insert(“Db.UserInfo”, p);
          string err = c.getLastError();
          if(!err.empty())
          {
              cout << “failed to insert into Db.UserInfo: ” << err;
              return 1;
          }
      }
      catch(const mongo::DBException &e)
      {
          cout << “exception occurred: ” << e.toString();

          return 2;
      }

  3. 遇到的问题
    • mongo::client::initialize()出现类似下面的崩溃
      Thread [1] 2560 [core: 2] (Suspended : Signal : SIGSEGV:Segmentation fault) 
              0x7fffffffdd80  
              ~_Function_base() at functional:2,030 0x448930  
              ~function() at functional:2,174 0x448930    
              mongo::client::Options::~Options() at options.h:32 0x448930 
              main() at main.cpp:17 0x43bf66
      stackoverflow的这个帖子给出了答案:应用程序和mongodb驱动使用了不一致的编码选项-std=c++11造成的。去掉这个选项就ok了。
    • 其他
  4. 其他
分类: C/C++, MongoDB, 数据库, 资料 标签: ,

MongoDB学习资料收集

2015年8月28日 没有评论
  1. 什么是MongoDBMongoDB is an open-source document database that provides high performance, high availability, and automatic scaling.开源的文档(json格式)数据库,高性能、高可用、易扩展,支持丰富的查询。
  2. 安装
    • 方法一:很简单,下载对应平台的二进制压缩包,解压即可。可执行程序放在bin子目录里。
    •  方法二:通过yum安装
      • 配置yum库
        • 创建MongoDB库文件/etc/yum.repos.d/mongodb-org-3.0.repo
        • 文件内容如下
          [mongodb-org-3.0]
          name=MongoDB Repository
          baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
          gpgcheck=0
          enabled=1
      • yum install -y mongodb-org
  3. 运行
    • 通过方法一安装:进入bin子目录,创建data/db目录,执行./mongod –dbpath ./data/db
    • 通过方法二安装:service mongod start。如果无法运行,查看运行日志/var/log/mongodb/mongod.log来排除问题
  4. 使用
    • 命令行工具mongo,由于MongoDB一定程度上和MySQL相似,其命令行工具也和mysql使用方法类似
    • 推荐一个GUI工具:MongoVUE
    • 增删改查(CRUD
    • 博客园里有个入门文章,简单明了。看这里
  5. 更多详细用法

more…

分类: MongoDB, 开发, 数据库 标签: ,

Heka教程

2015年8月24日 没有评论

1.Heka是什么

Heka is an open source stream processing software system developed by Mozilla.

  • Loading and parsing log files from a file system.
  • Accepting statsd type metrics data for aggregation and forwarding to upstream time series data stores such as graphite or InfluxDB.
  • Launching external processes to gather operational data from the local system.
  • Performing real time analysis, graphing, and anomaly detection on any data flowing through the Heka pipeline.
  • Shipping data from one location to another via the use of an external transport (such as AMQP) or directly (via TCP).
  • Delivering processed data to one or more persistent data stores.

2.如何安装

  • 二进制安装,直接从这里下载对应的安装包即可,方便。
  • 源码安装

3.怎么用

参见官方的Getting Started,后续将此文译成中文。

4.更详细的介绍

分类: 开发, 资料 标签: ,

部分编译安装boost

2015年7月1日 1 条评论

完整编译boost库需要很长时间,而且我们不一定会用到所有的库。那么如何只编译只需要的库呢?

  1. 解压boost源码,进入解压后的目录
  2. ./bootstrap.sh生成bjam
  3. ./bjam –build-type=complete –layout=versioned –toolset=gcc –with-thread –with-regex #–with指定所需要的模块
  4. ./bjam install #安装到默认路径下
分类: C/C++, 开发, 资料 标签: , ,

Git学习资料收集

2015年6月26日 没有评论

Git是现在流行的分布式版本管理工具。

之前的工作中使用SVN比较多,工作需要改成高大上的git了。这里收集了一些有用的git资料,备查。

Git参考手册:一个对Git Reference的翻译站点,很不错。

Git-Book:又一个中文版Git图书站点。

Git基础使用教程:博客园上的一篇文章。

分类: 开发, 资料 标签: ,