【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】 【领域:测试分析,自动化测试,性能测试,安全测试 】 【个人定位:高级测试工程师+培训师+领域产品专家】

发布新日志

  • Bash函数库终于完成稳定版开发了

    2009-09-05 18:09:57

    把自己的脚本整理了一下,修改了很多的设计。
    完善了部分函数,加上了自动升级与统计功能,终于可以像模像样了。
    这次改善,也摆脱了公司的限制,其他公司的朋友也可以使用了。
    先和邮件组的朋友们共享下。呵呵。小规模使用一下。

    show一下部分函数库的内容。

    rsa 机器名列表  #自动打通所有的服务器
    gexec 机器列表 命令  #机器批量操作。可以自动填写密码
    sevenexpect -p 提示 -a 动作 #自动化脚本自动生成
    screen_share #使用screen异地共享shell窗口
    google_top #使用google spreadsheet收集服务器监控数据,并绘图

    QA_valgrind #使用valgrind分析内存泄漏。这个没有技术含量。但是代表了一种封装的思想。
    httpload  #封装了http_load ,可以模拟loadrunner的加压方式,不断的增加并发数,然后自动统计多个结果为excel,发到邮箱。


    其他的函数,需要和朋友们与同事再慢慢完善。
    解决了ssh ip cmd与ssh ip,然后输入cmd的不同。提高了部分性能。
    终于形成了一个拿出手的稳定版了,庆祝下。
    下一步,就是慢慢把它变得更加易用,实用。切实产生效益。

  • 进程级性能测试监控函数更新simon_common

    2009-09-02 01:50:22

    发帖纪念一下,加班到了现在凌晨1点半。
    为了改善一个性能测试监控的函数。
    之前通过单纯的客户端直接发送数据到服务器进行绘图。
    实际中遇到了一些问题。

    1、客户端存在兼容性的问题。需要使用公司形形色色的服务器。
    2、监控的数据越多,会影响服务器的自身资源。

    后来进行了几种方法的尝试。

    1、通过google form把数据发送到google,让google去绘图。
    2、通过svn更新,传递到直接的绘图服务器上,然后通过绘图服务器上自己的客户端去分析数据,这样被监控的服务器只需要定期发送数据即可。节省了很多的资源。

    第一种方法也不错,但是google api需要啃下,短期内还不能形成好的可行的方案。
    第二种也有困难,公司的权限设置太严格,svn服务器在不同的机器上,有无法访问的风险。
    只好采用了第三种,直接通过nc发送数据到绘图的服务器,或者scp,rsync等。
    采用scp可能会影响到一点io,不过限于公司特殊的条件,也只有这个可以搞了。

    经过屡次的修改与完善,终于搞定了。


    实现了如下的功能


    [huangysh@qa16 ~]$ man simon_common
    =========================
    :<<simon_common_help
    simon_top_common methods_monitor process_name_or_pids [CPU MEM]
    simon_top_common top simond   #通过top收集特定关键词的进程信息,会进行求和统计。监控指标包括cpu,mem,rss,virt,shr
    simon_top_common ps sql  #通过ps去获得进程信息,可监控的指标包括cpu,mem,res,vsz,chtcount(进程的线程数)
    simon_top_common pid "3681,3787"  #通过pid去监控,这种比较节省资源。
    simon_top_common sql_pid "3681,3787"  #可以更改标示,用于区别不同的监控。但是标示的结尾一定要是ps,top,pid三种方式。
    simon_common_help


    [huangysh@qa16 ~]$ man simon_common
    =========================
    :<<simon_common_help
    simon_top_common methods_monitor process_name_or_pids [CPU MEM]
    simon_top_common top simond
    simon_top_common ps sql
    simon_top_common pid "3681,3787"
    simon_top_common sql_pid "3681,3787"
    simon_common_help
    =========================

    ========source code=========
    simon_common is a function
    simon_common ()
    {
        [[ $# -eq 0 ]] && echo "${function_name} java" && return;
        function_name="$1";
        process=$2;
        metrics=${*:3};
        if [[ ${*:$#} = "stop" ]]; then
             >~/QA/tmp/${function_name}_${process%%,*}_$USER.tmp.stop;
            echo ${function_name} would stop in 10s;
            gexec se1.asc.cnz.alimama.com "simon_file /home/$USER/QA/tmp/${function_name}_${process%%,*}_$USER.tmp $metrics stop";
            return;
        fi;
        case $function_name in
            *top)
                pids_get="top -b -n1 -p \`ps -o uname,pid,ppid,command -e|grep $process|grep -v 'grep $process'|awk '{print \$2}'|xargs|tr ' ' ',' \`|grep $process|awk '{print \$9,\$10,\$6,\$5,\$7}'|awk '{c+=\$1;m+=\$2;r+=\$3;v+=\$4;t+=\$5}END{print c,m,r,v,t}'";
                set ${metrics:="CPU MEM RES VIRT SHR"};
                print "the process is";
                pf $process
            ;;
            *pid)
                pids_get="top -b -n1 -p$process|sed 1,7d|awk '{print \$9,\$10,\$6,\$5,\$7}'|awk '{c+=\$1;m+=\$2;r+=\$3;v+=\$4;t+=\$5}END{print c,m,r,v,t}'";
                set ${metrics:="CPU MEM RES VIRT SHR"};
                print "the process is";
                top -b -n1 -p$process
            ;;
            *ps)
                pids_get="ps -eo uname,pid,ppid,thcount,pcpu,pmem,rss,vsz,sz,command|grep $process|grep -Ev '(grep $process|simon_file)'|awk '{print \$5,\$6,\$7,\$8,\$4}'|awk '{c+=\$1;m+=\$2;r+=\$3;v+=\$4;t+=\$5}END{print c,m,r,v,t}'";
                set ${metrics:="CPU MEM RSS VSZ THCOUNT"};
                print "the process is";
                pf $process
            ;;
        esac;
        echo $pids_get;
        [[ -f ~/QA/tmp/${function_name}_${process%%,*}_$USER.tmp.stop ]] && rm -rf ~/QA/tmp/${function_name}_${process%%,*}_$USER.tmp.stop ~/QA/tmp/${function_name}_${process%%,*}_$USER.tmp;
        while [[ ! -f ~/QA/tmp/${function_name}_${process%%,*}_$USER.tmp.stop ]]; do
            eval $pids_get;
            gsyn se1.asc.cnz.xxxx.com ~/QA/tmp/${function_name}_${process%%,*}_$USER.tmp >&/dev/null;
            sleep ${simon_ps_interval:=10};
        done >>~/QA/tmp/${function_name}_${process%%,*}_$USER.tmp & echo sleep 10s for init;
        sleep 10;
        gexecbg se1.asc.cnz.xxxx.com "simon_file /home/$USER/QA/tmp/${function_name}_${process%%,*}_$USER.tmp $metrics";
        print OK
    }
    ============================


  • 后台测试自动化稍早

    2009-08-20 21:59:50

    最近公司的同事开始了后台测试自动化的调研。
    能有这样的想法是很好的,之前搜索引擎端的自动化测试系统,就应用的非常好。
    但是要想建立一个崭新的框架来达到通用测试的地步,还是不太合适的。

    我积极的支持这个项目。不过自然也有不少的担心。在公司不方便说。在这里发泄下。
    我的观点是自动化测试稍早

    目前后台测试还不够深入。存在一系列的问题。


    1、测试功能点,测试范围不能捕获全面,导致测试用例设计不充分,覆盖率不够,很多bug都被pass过去了。
    公司举行过不少测试用例的设计,我也是经常去听。但是这些分析预计举例都是针对前台测试。虽然测试思路都是一样的。但是后台测试还是有一些概念是需要强化的。举个例子,如果一个产品的输入是一个网址,针对这个网址,前台的测试肯定是很多种的case,但是在后台,还要深入考虑更多的东西,比如这个网站是不是连接特别多,是不是单个网页的内容非常的大,是不是里面有一些特殊的字符,是否为flash,或者其他格式的内容等。这些都是后台需要关注的。

    2、业务,算法逻辑不精通。
    不少项目,都测试过去了,测试工程师还对他的算法与逻辑模棱两可,常常是一知半解。
    对我来说,这是无法容忍的。

    3、缺乏良好的后台测试思路
    定义测试范围,采用什么策略。
    可否利用数据驱动测试,可否采用自动化,是否进行充分的分析。
    有没有画过数据流,逻辑流,状态流。

    目前后台测试方面的问题多多,但是没有太多前人的经验与现成的资料可供借鉴。一起还需要积极的总结,总结项目经验,这些东西,都是要慢慢完善的。
    我已经开了一个课题,开始做总结,分析自己的,也借鉴别人的。

    这些问题,如果不能有效解决的话,后台测试的自动化就只能沦为一副空架子而已。

    不过小范围的自动化测试,倒是可以实现的。针对个别应用的架构是可以设计的。比如p4p引擎的测试。
    目前放慢了对技术的研究,开始总结一些非技术的因素。希望2个月的时间,可以出个文档出来。




  • 使用google form进行性能测试数据监控

    2009-08-19 17:54:00

    之前写过的一个simon_top脚本不够通用。监控进程信息需要依赖的东西太多。
    唯一的好处,就是可以对数据进行实时的监控与跟踪。比nmon要强一些。
    当然,nmon封装后,也可以达到这个效果的。

    编写了一个新的google_top。可以发进程的数据,直接发到google form。然后通过google form的gadget进行实时的绘图。已经实现了一部分。有待进一步完善。

    http://spreadsheets.google.com/pub?key=teymlJnnKUcm09ywuFcxksQ&gid=0

    这是示例,是公司某台服务器桑,某个进程的top基本信息。包括cpu,mem,res,virt,shr等。
    数据每隔10s发送一次,网页上的显示的数据,每5分钟会刷新一次,如果你不刷新网页的话。
    对google api了解的不是太多。但是对google chart api,google gadget api,google Visualization
     api是非常的喜欢。

    然后预定了两本书。《google api》,《google hack》。








  • 迅雷今天发生了更新失误

    2009-08-02 18:06:02

    今天利用迅雷搜索一些资料的时候,意外发现迅雷个别的页面出错了。
    错误的页面只出现了十分钟左右就消失了。

    第一个是问题是首页的搜索页面。如果输入“刘青云”,就进入了结果页面,点击“第二页”,就会发现,上面的搜索栏里的内容竟然变成了“刘青亿page=2”,看来是代码级别的错误。应该是更新代码的时候,逻辑出错导致的。因为这个问题修复的比较快,我没有截图下来。


    第二个是分类页面。如下图。页面的解析出错,导致直接报出了迅雷网站的整个虚拟目录结构。是文件挪移的时候,路径没有找到导致了这个错误。这些重要信息,这么轻易就暴露了。
    看来今天是迅雷搞升级导致了。


  • linux下使用bash进行url编码的两种方法

    2009-07-24 19:59:31

    看到网上广为流传的一篇文章,使用awk与od对汉字进行url编码。本来想拿来用的,结果发现通用性也太不好了,如果哦不是汉字什么的,就编码出错。
    原文地址  http://linux.ccidnet.com/art/302/20061009/916847_1.html
    后来感觉这个urlquote编码很常用,很多地方都用到了。使用我原来的的方法有些限制,就重新使用od再实现了一个。
    分享下。


    我原来的解决方式是在shell中调用python去编码,代码如下。

    urlquote()
    {
        [[ $# = 0 ]]&&echo urlquote string&&return
        echo "#coding=utf-8;
    import urllib,sys;print urllib.quote('$1');" |python
    }

    小技巧,这是shell语句,其实却是调用的python。大家以后使用shell不爽的话,可以在shell中调用python,ruby之类的,都是可以的。要想歪点子。呵呵。
    需要注意的是,格式要拍好,因为python是靠缩进来判断语句的。vi的默认缩进,容易把格式搞乱。


    但是这种方式依赖python,如果机器上没有的话,就很麻烦。另外效率也是个问题。的确用python慢一些。
    看到了网上有人使用od来获得16进制数据来拼装,我也就使用od去拼装吧。
    网上的那位仁兄使用awk处理的那么麻烦,其实是忽略了od的-x1 参数。使用单个字节就可以了。
    默认的两个字节显示的话,顺序上是颠倒的。


    :<<url_help
    used for replace urlquote
    url 123xxxxxx
    url_help
    urlquote()
    {
        local msg=`echo "$*"|od -t x1 -A n|xargs|tr -d '*'|tr " " %`  #使用od转换为16进制,同时把空格换成%,正好实现了url编码。
        msg=${msg/$msg/%$msg}  #加上头部缺少的%
        echo ${msg%\%0a}  #去掉最后多余的%oa。od生成的。
    }


    不过在编码大数据量的时候,od会进行一些特殊的处理,比如加星号之类的,所以我重新修改了下。
    要是想干脆点的话,直接使用如下代码即可。
    echo 你要编码的文字|od -t x1 -A n -v -w10000000000 | tr " " %


    下面我是写的一个比较完备的方式。可以支持多种调用方式,也可以与以前的方式兼容。使用的时候,使用如下三种方式调用就可以。
    urlquote  你要编码的文字
    echo 你要编码的文字|urlquote
    urlquote < 你的文件 

    详细代码。




    [huangysh@qa16 ~]$ qahelp urlquote
    =========================
    :<<urlquote_help
    used for replace urlquote
    urlquote 123xxxxxx
    urlquote mesage"fsef
    fsefsf"  #support for multiline
    urlquote_help
    =========================

    ========source code=========
    urlquote is a function
    urlquote ()
    {
        [[ -n $* ]] && {
            echo "$*" | od -t x1 -A n -v -w10000000000 | tr " " %;
            return
        };
        while read line; do
            echo -n $(echo "$line"|od -t x1 -A n -v|tr " " %) | tr -d " ";
        done;
        echo
    }
    ============================



    ==========================

    最近从网上搜索资料,发现这个blog排名满靠前的。
    上面介绍的方法之适合处理少量的文本,如果你的文本有上百万行,性能与时间就是问题了。解决方法很简单。直接使用python或者ruby去处理即可。echo,read line之类的命令就可以丢掉了。

    ruby的推荐如下。

    使用urlquote_ruby 文件名   即可。
    速度绝对没的说。

    urlquote_ruby()
    {
        local f=$1
        ruby -e "require 'cgi';IO.foreach('"$f"') { |line| puts CGI.escape(line.chomp) }"
    }




  • Bash构造测试用数据

    2009-07-22 23:24:16

    最近要进行灰盒测试。测试一个hash函数。为了方便遍历大多数的数据分支,就写了一个bash 函数用于生成数据。
    后来发现很有用,就共享出来,希望对大家有帮助。



    x=' ( a b c d e f g h i x y z , ! @ $ % ^ &  ( ) _ _ + | < > ? ) : " { } [ ]' #构造随机的字符串的每个字符的范围
    for((i=0;i<1000;i++));do data_bylen $i $x;done > data  #写入1000个字符串到数据文件。
    while read line ;do ../../bin/SHash $line|| print $line;done < *data  #调用程序去处理。

    不过数据case不全,我只是举个例子而已。用来生成数据还是蛮有用的。

    两种用法
    data_bylen 10 a   生成10个a
    data_bylen 10 a b c  生成 10 个由 a b c随机字母组成的字符串。


    未来几天,打算精心构造一批生成数据的bash函数,来方便测试。以前手工测试时候总结的数据类型,终于可以派上用场了。数据生成的技术含量也不少,攻关下。



    [huangysh@qa16 SHash]$ qahelp data_bylen
    =========================
    :<<data_bylen_help
    data_bylen size meta_string
    data_bylen size meta_string_list
    data_bylen 10 a
    data_bylen 10 a b c
    data_bylen_help
    =========================

    ========source code=========
    data_bylen is a function
    data_bylen ()
    {
        unset meta_string;
        meta_string=(${*:2});
        local size=$1;
        local i;
        for ((i=1 ; i<=size ; i++))
        do
            random_num=$((RANDOM%($#-1)));
            printf "%s" ${meta_string[*]:$random_num:1};
        done;
        echo
    }
    ============================




  • bash登陆旺旺尝试(二)

    2009-07-17 22:30:10

    犯了个错误,我低估了阿里旺旺网页版的登录过程。
    发现中间的登录过程和cookie传输有不少的暗桩。

    重新翻看了curl的官方帮助,检查下一遍,确认自己没有用过。因为我发现网上很多人写的curl教程,都不是太正确。个别的参数理解错误了,比如-D -b -c -F -H等涉及cookie的参数。

    因为之前我精简了部分的登录过程,导致了cookie的值不正确,而且发到网页版的服务器时,压根没有把cookie加上。使用-b 把从firefox中获得的cookie搞上,就没有问题。看来是cookie处理的过程,我漏掉了部分细节。


    使用commview去抓包。得到了发消息的全过程。暂时没有发现cookie的诀窍。
    打算使用curl一步步的模拟,把所有的过程都弄上。看看能不能得到最终的cookie。
    又搞了2个小时,无果。
    最郁闷的是,淘宝限制了登陆次数的常数,搞得我试验了几次后,就被封ip了。
    不过curl倒是各个功能都尝试了一遍。算是有些收获吧。有时间再弄。

    下一步要解决的问题。

    1、cookie的生成与传输过程揭秘。
    2、绕过验证码发送消息。希望旺旺在这方面有漏洞可钻。



    摘录一个数据。纪念下。



    ..POST /wangwang/webwwtb HTTP/1.1
    Accept: */*
    Accept-Language: zh-cn
    Referer: http://webwwtb.im.alisoft.com/wangwang/webww.htm?
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    Host: webwwtb.im.alisoft.com
    Content-Length: 157
    Connection: Keep-Alive
    Cache-Control: no-cache
    Cookie: _nk_=jdAj1Llo632cxxpnzH1TFMI=; CHECKCODEcnalichnhuangseven=e82820ef17065bb6ac9ae9d511af31331247835695553; pmt0=4hiYirj/b8J4Jh8Ely2wQZ33+1YQTkxx346srLHmAIsx+Fjzgb2IlJebwvJL45xjbp3KYUD4+yFHq+F/whAKofg5oUWmyKVC1qw9vBINOJCP5vWwjyX75vApADIGqESv+lmfAJKIDLz6Gza0QnkrfzaSaRa2wtcXA7eI6F8klsV/0VyzQkwh4+I2rPVtQjhdIIIz3El8nhSU9BRKbjkOiN06VdLmHTML3CTdV+8Z6OjIo3b0KbHD2TkmiSlOP+07/dQXA5E0uQTmVwyKZO27eEQCs4p8gfIFm5+DDOMFqTT4c1MXZ47P7w==; cnalichnhuangseven_chatcard=; cntaobaosihanjishu_chatcard=; __last_login_ver__=; cnalichnhuangseven=chs; cntaobaobst_seven=chs; cntaobaobst_seven_chatcard=; JSESSIONID=XycjaKLKIPhdBUmy; tmp0=Ob4fcTZqYWqQ+7aOyNUdFtR0TnLmXcEjEAGGE3owBt/qZifBrdNyWnVGYA1pVxuG6lxNCdnhSdbVCy7/3k1xlk7JGn+bDhW3Dtf5W+HJJPcsc1n0JLQoLFSia6djwSxz8W9FwYD9/mfhiCKAJuLoc0HrvD5AMFs+2uywV73cfLRGbxWpFpqjGsF815bRkwOat4h3iuLP8jTO456BaKrXxSqeOcZrs7tBZ0z0OR9JurutNZValPHHJJd2tALmeH9KcEFGVZMtPzRG2+nzACWEodzCw7LWMYkiG3gEGSDwKarcLQG868is5HgoZw8R3yAQ7Uejuc5ZdzZiJ9i9HELgrCt8gxten9rs9gdB/xCk7Kpd3MyvZMYlzSmQeph9K2//8NMp+vCn2IfVBCL5auR8zi7uTyswUY64QFQ7EYiwbS3etYI84Wt72xkhc5GrfgKTYXT2heCeFJwWjr6iNj5M2x6BrhZMmuXJ+3b5Pm7WDSYc0Cy3MHbFT8txDws8IFa+PgxiG81Ew9qwQyf45jDECA==; __last_login_ww__=cnalichnhuangseven; ystat_bc_648568=3947965907669682758; lastUrl25939996cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D25939996%26imAppId%3D19437%26appInstanceId%3D; lastApp25939996cnalichnhuangseven=19437; lastUrl29130588cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D29130588%26imAppId%3D19437%26appInstanceId%3DTRIBF3DAB36A64255961B686280780515DBE; lastApp29130588cnalichnhuangseven=19437; lastUrl10435618cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D10435618%26imAppId%3D19437%26appInstanceId%3D; lastApp10435618cnalichnhuangseven=19437; lastUrl498010cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D498010%26imAppId%3D19437%26appInstanceId%3D; lastApp498010cnalichnhuangseven=19437; lastUrl52198947cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D52198947%26imAppId%3D19450%26appInstanceId%3D; lastApp52198947cnalichnhuangseven=19450; lastUrl32213393cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D32213393%26imAppId%3D19450%26appInstanceId%3D; lastApp32213393cnalichnhuangseven=19450; lastUrl26596140cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D26596140%26imAppId%3D19437%26appInstanceId%3D; lastApp26596140cnalichnhuangseven=19437; lastUrl93347296cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D93347296%26imAppId%3D19450%26appInstanceId%3DTRIB5A31A85045F86C6DD010629BB594FEF9; lastApp93347296cnalichnhuangseven=19450; lastUrl34066799cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D34066799%26imAppId%3D19437%26appInstanceId%3DTRIBA4FC65C191F7BB122183A980AB8D9E8C; lastApp34066799cnalichnhuangseven=19437; lastUrl29980269cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D29980269%26imAppId%3D19437%26appInstanceId%3D; lastApp29980269cnalichnhuangseven=19437; lastUrl2513149cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D2513149%26imAppId%3D19437%26appInstanceId%3D; lastApp2513149cnalichnhuangseven=19437; lastUrl7754668cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D7754668%26imAppId%3D19437%26appInstanceId%3DTRIB6FC620DC9CF8C76360DE1CCD9B2362F7; lastApp7754668cnalichnhuangseven=19437; lastUrl14117160cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D14117160%26imAppId%3D19437%26appInstanceId%3D; lastApp14117160cnalichnhuangseven=19437; lastUrl106973556cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D106973556%26imAppId%3D19437%26appInstanceId%3D; lastApp106973556cnalichnhuangseven=19437; lastUrl35837690cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D35837690%26imAppId%3D19450%26appInstanceId%3D; lastApp35837690cnalichnhuangseven=19450; lastUrl58870050cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D58870050%26imAppId%3D19450%26appInstanceId%3D; lastApp58870050cnalichnhuangseven=19450; lastUrl104689323cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D104689323%26imAppId%3D19450%26appInstanceId%3D; lastApp104689323cnalichnhuangseven=19450; lastUrl9568809cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D9568809%26imAppId%3D19450%26appInstanceId%3D; lastApp9568809cnalichnhuangseven=19450; lstat_bc_1167722=11498438611695084407; lastUrl31819614cnalichnhuangseven=http%3A//mall.alisoft.com/apps/mysoft/ImTab%21imTribeSoft.jspa%3FimTribeId%3D31819614%26imAppId%3D19450%26appInstanceId%3D; lastApp31819614cnalichnhuangseven=19450; ali_apache_id=121.0.29.226.1247210949454.6; wwka=1247835684812; JSESSIONID=43D68A49E4900A4A1B7792288AECFECD

    act=doSendMsg&msgId=1247835685968&msg=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&toUid=cnalichnhuangseven&kp=1247835685968HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5
    Cache-Control: no-cache
    Set-Cookie: wwka=1247835685968; Path=/
    Set-Cookie: CHECKCODEcnalichnhuangseven=512277c03d37a1266d07f7cbe975c9601247835700494
    Content-Type: text/html;charset=UTF-8
    Content-Length: 133
    Date: Fri, 17 Jul 2009 13:01:39 GMT

    OK.1247835685968.cnalichnhuangseven.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.2009-07-17 21:01:40
  • bash登陆旺旺尝试(一)

    2009-07-17 01:57:37

    想写个脚本,可以通过旺旺来发送消息给特定的用户。
    因为旺旺有网页版,所以这是首选网页版。
    使用curl去登陆尝试,不过发现curl貌似没有把cookie加到后面的请求中。
    而且发现旺旺网页版的cookie是一直变动的。消息的id也是变动的。
    折腾了很久,就是没有发送成功。


    后来使用大鲨鱼去监控阿里旺旺软件的tcpsocket通信信息,结果发现也是挺繁琐的。就还是放弃了。重新回到网页版上。

    研究了2个小时,啥也没有成功,郁闷,有机会再搞。


    发现了旺旺上线的一个关键数据包。


    http://webwwtb.im.alisoft.com/wangwang/webwwtb

    POST /wangwang/webwwtb HTTP/1.1
    Host: webwwtb.im.alisoft.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Referer: http://webwwtb.im.alisoft.com/wangwang/webww.htm?
    Content-Length: 34
    Cookie: ali_apache_id=121.0.29.225.81881387989548.0; __last_login_ver__=; pmt0=YyBjVg985K5R8PDsXx05O5paYQYVWV4OrzmPbFzZqbjSp0/4JSPXZYcJcjjmfMzsGlDl5TtLtXbqTL4NRpBDV7YsyRySV0286tqpwuJUerm3qVzV/Whrju4Bs2sXD3W2Rf0MESlIFFrqe9jEbUIN5aP4PK0Go7xKJDmLvKN4TENBH49D0sOcGmooi4B7USzlOXb3AxpJ/oJtYn9YgNJFXS0vccM6AFVO5o/oI3xKF++wlxqowNGVlQMH74vwpTVa6qsUY3rexnyFPid+gtXe/9W+XVRdE1c6i2snVAiL4lPDY2QfN9tamQ==; wwka=1; JSESSIONID=D1460AD3356C09F885EF8680A635BC48; JSESSIONID=r5bTs1DkoY+pD7JT; tmp0=tWsPnX2H3JjJ8uXv6vdgbxrHOc8/UF+1Eg+iYr+O5jJgw/Sw/5UqwlJ+lIUHAIqMiVCQPceNsinlQxJeNXA2XyO1piezoUuLjIq91oYSlV/vfFC9oxQmtQ3gBwhS7uu50xkY8bMjdrYEg+Esv560i7VkuZsG0RUUs8qKDodCfYDufO+neuRRne86GEbB2PeiSpDt5cJ8qr+3eedq8xFWsUaexT8g6UWROFEpEt2oStBJicTuzUet/5cnL2HbNlXx9T7FhJsjJqi0uIqFSMJf+mGqogdxO/8OmQxLjwCrFU5lL4VjmUkvjl4soCXYyP6qwVDRQbOKaoXe1O9fJeI6ewpTsYbFFRRLoWC8SYuw0J4cCuvIe5fIsaE5zGIBz3xFgv9po1+j2DvR7ySJ/poZB86vVO+olVgjGiBMi4NYyNKuF8AaVFHoMcYW4TrWb4grcyYx6EOplJfqfpjGRpkUiAV3OQKUbd/olpum9kI0eTOKOZrF+aGy3eLSJLU7m1FZiYSwYzxDAsIwWhkj3CyMzg==
    Pragma: no-cache
    Cache-Control: no-cache
    act=doCheckStatus&kp=1247765958929


    HTTP/1.x 200 OK
    Server: Apache-Coyote/1.1
    X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5
    Cache-Control: no-cache
    Set-Cookie: wwka=1247765958929; Path=/
    Content-Type: text/html;charset=UTF-8
    Content-Length: 24
    Date: Thu, 16 Jul 2009 17:39:33 GMT






    登陆网页版旺旺的函数代码如下。cookie没有处理好,下一步要 试验curl的cookie功能了。

    wangwang()
    {
        curl -v -c /tmp/ww.txt  -d 'TPL_username=xxxxx&TPL_password=xxxxxxx&Submit=%B5%C7+%C2%BC&actionForStable=post_user_action&action=Authenticator&TPL_redirect_url=&_oooo_=&event_submit_do_login=anything&abtest=&pstrong=1&from=&yparam=&done=' 'http://member1.taobao.com/member/login.jhtml'
        curl -v -b /tmp/ww.txt  -c /tmp/ww.txt  'http://webwwtb.im.alisoft.com/wangwang/webww.htm'
        curl -v -b /tmp/ww.txt   -c /tmp/ww.txt  -d 'act=doCheckStatus&kp='`date +%s`000  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
        curl -v -b /tmp/ww.txt   -c /tmp/ww.txt   -d 'act=doGetActiveDegree'  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
        curl -v -b /tmp/ww.txt   -c /tmp/ww.txt   -d 'act=doGetActiveDegree'  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
        curl -v -b /tmp/ww.txt   -c /tmp/ww.txt   -d 'act=doGetActiveDegree'  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
        curl -v -b /tmp/ww.txt  -c /tmp/ww.txt   -d 'act=doCheckStatus&kp='`date +%s`000  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
        while :
        do
            read -t 1 && break
            #curl -v -b /tmp/ww.txt  -d 'act=doCheckStatus&kp='`date +%s`000  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
            curl -v -b /tmp/ww.txt   -c /tmp/ww.txt   -d 'act=doKeepAlive&kp='`date +%s`000  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
            curl -v -b /tmp/ww.txt   -c /tmp/ww.txt  -d 'act=doGetActiveDegree'  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'
            curl -v -b /tmp/ww.txt  -c /tmp/ww.txt   -d 'act=doGetActiveDegree'  'http://webwwtb.im.alisoft.com/wangwang/webwwtb'       
        done
        curl -v -b /tmp/ww.txt  -d 'act=doSendMsg&msgId=1247756217652&msg=ffffffffffffffffffffffffffffffffffffffffffff&toUid=cnalichnhuangseven&kp=1247756217653' 'http://webwwtb.im.alisoft.com/wangwang/webwwtb'

    }
  • 黑客帝国中使用linux的片段

    2009-07-05 18:38:20

    昨天看了一晚上的《黑客帝国》,我不太喜欢这个电影,主要是里面的武打动作太做作。
    把各国的武术都模仿了一边,全是邯郸学步的花架子。

    看这部电影,是为了找里面的一段视频。就是女主角使用nmap+sshnuke入侵母体的电厂系统。
    我想截取这段视频,用来激励下一期的学员。还好,看到深夜两点,终于捕获了那段珍贵的视频。


    截图了几张。分享下。









  • bash加密字符串

    2009-07-04 16:04:33

    为了自动化,需要保存密码到特定的位置,但是又不想让别人轻易的获得密码。就只能去加密了。
    首先的是,加密方法肯定要是可逆的,不然也没有什么用了。
    只能用来唬唬新手。


    加密原理,获得用户输入的密码,然后在密码最后加上一个当前帐户的名字。同时把所有的英文字母右移一位并变换大小写。把所有的数字都也转变一下,取与9差的绝对值。比如ABZabz1278 就会变成 bcaBCA8712。

    这样简单加密出来的东西,看起来也像是密码,起到伪装的作用。
    当然我只是进行了一层的加密,你可以变换加密规则,更换加密层次,来达到更强的伪装。


    加密方法代码



    QA_encrypt ()
    {
        read -p "please set your password   " PW;
        ex sudo echo Test your password | grep incorrect && print password is incorrect && return;  #检查是否正确,ex是个自动输入密码的函数,请暂时忽略。
        pw=`echo $PW$(whoami)|tr "[a-y]z[A-Y]Z[0-4][5-9]" "[B-Z]A[b-z]a[5-9][0-4]"`; #加密

    }
    ============================

    [huangysh@qa16 ~]$


    解密反过来就行了。因为加密的密码中有当前帐户的信息,所以,其他账户的人,通过解密脚本是得不到你的密码的。
    当然,研究完代码,就什么都不知道了。破解很容易。
    我不是为了安全,而是为了让不同的账户在加载别人的文件的时候,不那么轻易得到密码而已。

    QA_decrypt ()
    {
        [[ -n $pw ]] && epw=`echo $pw|tr "[B-Z]A[b-z]a[5-9][0-4]" "[a-y]z[A-Y]Z[0-4][5-9]"` && PW=${epw%`whoami`}  #解密
    }



    =========================================================

    不过经过了一天,回头看的时候,发现这样加密的话,解密的时候,中间过程会出现部分明文密码。我就修改了下。
    把密码先加密,然后加上当前帐户的名字,然后再加密。
    解密过程相反,这样就ok了。

    QA_encrypt ()
    {
        read -p "please set your password   " PW;
        ex sudo echo Test your password | grep incorrect && print password is incorrect && return;
        pw=`echo $(echo $PW|tr "[a-y]z[A-Y]Z[0-7]89" "[B-Z]A[b-z]a[2-9]10")$(whoami)|tr "[a-y]z[A-Y]Z[0-7]89" "[B-Z]A[b-z]a[2-9]10"`;  # 关键的加密过程。两次加密,
    }



    QA_decrypt ()
    {
        [[ -n $pw ]] && epw=`echo $pw|tr "[B-Z]A[b-z]a[2-9]10" "[a-y]z[A-Y]Z[0-7]89"`; #第一解密
        epw=${epw%`whoami`}; #去掉帐户名字
        PW=`echo $epw|tr "[B-Z]A[b-z]a[2-9]10" "[a-y]z[A-Y]Z[0-7]89"` #再次解密
    }



    alibabaASCQA2008  加密后就是 cnkdcdcCUESC6443IVBOHZTI

    这样就差不多了。可以忽悠下新手了。其他团队有人简单实用base64加密。这种方式太脆弱了。一看就知道。而且解密容易,还要保证本机有base64.不够灵活。
    使用tr就足够了。








  • 使用screen与expect共享shell

    2009-07-02 21:03:26



    上次写完了Linux下共享screen进行协作  后,感觉那样草草总结了,有点不负责任。
    就重新利用screen与expect封装了下,把细节全都封装了。

    使用前提,本机有screen与expect

    用法

    A求救于B,A执行screen_share B。然后会提示一条命令语句,同时会把命令发给B用户。
    B看到命令,并执行后,两个人就在同一个shell下了。


    :<<screen_share_help
    share you screen to others, it use screen to share and communicate, a weak is that it's can't allow more than 4 users
    screen_share huangysh
    screen_share gaoyang huangysh huangyj winniwei
    screen_share_help
    screen_share()
    {
        [[ $# = 0 ]] && echo please input a system user from who you want to communicate && return
        ex sudo chown root:root `which screen`
        ex sudo chmod +s `which screen`
        #ls -l `which screen`
        for u in $*
        do
            for t in  `who |grep $u|awk '{print $2}'`;
            do
                echo `which screen` -rx $USER/$USER |write $u $t ;
            done
        done
        echo Let your friends excute this below
        print `which screen` -rx $USER/$USER

        read -t 5 -p "Any key to enter the screen    "
        export screen_share_users="$*"
        expect -c  '
        set timeout -1
        spawn screen -R $env(USER)
        match_max 100000
        send -- "\r"
        send -- "\r"
        send -- "'$'\cA:''"
        send -- "multiuser on\r"
        send -- "\r"
        send -- "'$'\cA:''"
        send -- "acladd $env(screen_share_users)"
        send -- "\r"
        send -- "\r"
        interact
        '
    }

  • Linux下共享screen进行协作

    2009-06-30 20:23:43

    平时工作,同事之间,难免会遇到一些问题,进行求助。
    如果碰巧工作地点不在一地,那么就非常的不便。
    尤其是新手,根本无法把问题描述清楚,让buddy比较郁闷。
    另外,工作中,也的确有需要一起配合工作,比如实现同步的教学之类的。

    为了解决这个平时的工作小问题。我总结了以下两个方法。

    1、使用screen。
    screen是个管理员非常重要的工具,它可以让保存session,保留程序的执行环境,非常的方便。
    screen是可以进行多用户连接的。不过方法比较麻烦。可以参考下
    http://bypassinternetfilters.com/index.php?hl=f5&q=uggc%3A%2F%2Frxnfuvqn.jbeqcerff.pbz%2F2006%2F11%2F06%2Ffperra-zhygvhfre%2F

    问题是整个网上都这样说,开始我愣是没有试验通过。真是奇怪。后来无意发现,screen是个连接,指向了另一个文件,必须使用二进制程序去执行才能具备suid,连接是不具备的,
    同时也因为操作有点麻烦那,不方便使用。
    可以使用的就是两个人用同一个帐号登陆,这样就不好了。改进方法研究中。
    总体的命令就是
    sudo chmod +s /usr/bin/screen
    multiuser on
    acladd huangysh
    貌似也不多,但是想让别人去用,不过推广起来还是挺周折的。很多同事是懒得去研究。

    看到很多人把screen的用法写的很随便,转帖下官方的说明吧。不过好像没有远程连接的功能,我是没有找到。

    screen [ -options ] [ cmd [ args ] ]
    screen -r [[pid.]tty[.host]]
    screen -r sessionowner/[[pid.]tty[.host]]


    2、使用kibitz

    kibitz是expect工具包的一部分,没有的话,就需要从网上下载并编译了。
    用法比较简单,在本机通过用户就可以简单呼叫别人。
    比如kibitz huangysh
    那么huangysh帐号登陆的话,就会在console上收到一个广播消息。告诉你如何去连接,一般是执行一个命令,比如
    Can we talk? Run: kibitz -31317

    你只需要执行kibitz -31317  就可以连接上。
    蛮方便的。



    我想肯定也有其他的方法的。不过目前对终端,tty,pts等概念不是太熟悉。还不知道如何去充分的利用他们。



  • 进程级性能监控方案上

    2009-06-19 18:19:09

    把公司的一款监控系统资源的工具给hack了一下。
    研究了一下c代码。然后自己写了一个小小的客户端。只是接受数据,然后发送到服务端。
    服务端使用rrdtool去绘图。

    然后我又写了一个脚本,封装了ps和top,可以使用ps和top进行系统资源的监控。

    发现在多核服务器的情况下。ps和top的cpu监控指标不一样。后来研究了一下。发现意思不一样。详细内容请参考man帮助。对于代码如何去获取系统的指标这点还不是太清楚。网上没有什么评论。有机会只能去翻top的代码了。
    另外说下pidstat这个工具,它能获取io指标。不知道什么原理。打算下一步去研究下。
    使用pidstat去监控是指标最全的。
    另外,同事提到了nmon,也挂上研究日程。


    使用方法:simon_top 进程关键词 CPU MEM SHR
    参考后面的代码中的注释。

    服务器上的截图。






    代码



  • 终于成为教授了

    2009-06-07 00:38:55

    准备了很久,终于决定要加入公司的“教授”队伍了。
    其实自己很菜,但是我想毕竟自己也有自己的所学。
    已经通过了。下一步就要开始行动了。
    行动了还不够,还要有表现,需要别人的认可才可以。

    下步的计划

    1、买权威的shell书,对自己的知识查缺补漏。看看shell高级编程。
    2、学linux,增强全面性和深度。(看已买的基本linux图书,深入进去)
    3、准备课件
    bash基础
    编码与解码浅析
    bash之全新函数式编程与qa函数库


    最新修改为
    bash基础与qa函数库

    专注在这一个方面上。


  • curl作用详谈

    2009-05-20 11:27:09

    这是curl的官方地址。里面描述是最详细的。如果你知道的内容不够多的话,可以继续在里面探索。
    非常棒的一个工具。
    http://curl.haxx.se/docs/manpage.html  众多的命令参数
    http://curl.haxx.se/docs/httpscripting.html  众多的浏览器模拟方法



    同时,转一份前人编写的使用心得吧,写的还是挺全的。

    这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑

    1)
    二话不说,先从这里开始吧!

    curl http://www.yahoo.com

    回车之后,www.yahoo.com 的html就稀里哗啦地显示在屏幕上了~~~~~

    2)
    嗯,要想把读过来页面存下来,是不是要这样呢?
    curl http://www.yahoo.com > page.html

    当然可以,但不用这么麻烦的!
    用curl的内置option就好,存下http的结果,用这个option: -o
    curl -o page.html http://www.yahoo.com

    这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就OK咯

    3)
    什么什么?!访问不到?肯定是你的proxy没有设定了。
    使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x
    curl -x 123.45.67.89:1080 -o page.html http://www.yahoo.com

    4)
    访问有些网站的时候比较讨厌,他使用cookie来记录session信息。
    像IE/NN这样的浏览器,当然可以轻易处理cookie信息,但我们的curl呢?.....
    我们来学习这个option: -D <-- 这个是把http的response里面的cookie信息存到一个特别的文件中去
    curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

    这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了

    5)
    那么,下一次访问的时候,如何继续使用上次留下的cookie信息呢?要知道,很多网站都是靠监视你的cookie信息,
    来判断你是不是不按规矩访问他们的网站的。
    这次我们使用这个option来把上次的cookie信息追加到http request里面去: -b
    curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.yahoo.com

    这样,我们就可以几乎模拟所有的IE操作,去访问网页了!

    6)
    稍微等等~~~~~我好像忘记什么了~~~~~
    对了!是浏览器信息~~~~

    有些讨厌的网站总要我们使用某些特定的浏览器去访问他们,有时候更过分的是,还要使用某些特定的版本~~~~
    NND,哪里有时间为了它去找这些怪异的浏览器呢!?

    好在curl给我们提供了一个有用的option,可以让我们随意指定自己这次访问所宣称的自己的浏览器信息: -A
    curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.yahoo.com

    这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的IE6.0,嘿嘿嘿,其实也许你用的是苹果机呢!

    而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台PC上跑着的Linux,用的是Netscape 4.73,呵呵呵

    7)
    另外一个服务器端常用的限制方法,就是检查http访问的referer。比如你先访问首页,再访问里面所指定的下载页,这第二次访问 的referer地址就是第一次访问成功后的页面地址。这样,服务器端只要发现对下载页面某次访问的referer地址不是首页的地址,就可以断定那是个 盗连了~~~~~

    讨厌讨厌~~~我就是要盗连~~~~~!!
    幸好curl给我们提供了设定referer的option: -e
    curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.yahoo.com" -o page.html -D cookie0001.txt http://www.yahoo.com

    这样,就可以骗对方的服务器,你是从mail.yahoo.com点击某个链接过来的了,呵呵呵

    8)
    写着写着发现漏掉什么重要的东西了!----- 利用curl 下载文件

    刚才讲过了,下载页面到一个文件里,可以使用 -o ,下载文件也是一样。
    比如, curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
    这里教大家一个新的option: -O
    大写的O,这么用: curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG
    这样,就可以按照服务器上的文件名,自动存在本地了!

    再来一个更好用的。
    如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载,难不成还要让我们写一个script来完成这些操作?
    不干!
    在curl里面,这么写就可以了:
    curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

    呵呵呵,厉害吧?!~~~

    9)
    再来,我们继续讲解下载!
    curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

    这样产生的下载,就是
    ~zzh/001.JPG
    ~zzh/002.JPG
    ...
    ~zzh/201.JPG
    ~nick/001.JPG
    ~nick/002.JPG
    ...
    ~nick/201.JPG

    够方便的了吧?哈哈哈

    咦?高兴得太早了。
    由于zzh/nick下的文件名都是001,002...,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了~~~

    没关系,我们还有更狠的!
    curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

    --这是.....自定义文件名的下载?
    --对头,呵呵!

    #1是变量,指的是{zzh,nick}这部分,第一次取值zzh,第二次取值nick
    #2代表的变量,则是第二段可变部分---[001-201],取值从001逐一加到201
    这样,自定义出来下载下来的文件名,就变成了这样:
    原来: ~zzh/001.JPG ---> 下载后: 001-zzh.JPG
    原来: ~nick/001.JPG ---> 下载后: 001-nick.JPG

    这样一来,就不怕文件重名啦,呵呵

    9)
    继续讲下载
    我们平时在windows平台上,flashget这样的工具可以帮我们分块并行下载,还可以断线续传。
    curl在这些方面也不输给谁,嘿嘿

    比如我们下载screen1.JPG中,突然掉线了,我们就可以这样开始续传
    curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG

    当然,你不要拿个flashget下载了一半的文件来糊弄我~~~~别的下载软件的半截文件可不一定能用哦~~~

    分块下载,我们使用这个option就可以了: -r
    举例说明
    比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 要下载(赵老师的电话朗诵 :D
    我们就可以用这样的命令:
    curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
    curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
    curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3 &\
    curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.mp3

    这样就可以分块下载啦。
    不过你需要自己把这些破碎的文件合并起来
    如果你用UNIX或苹果,用 cat zhao.part* > zhao.mp3就可以
    如果用的是Windows,用copy /b 来解决吧,呵呵

    上面讲的都是http协议的下载,其实ftp也一样可以用。
    用法嘛,
    curl -u name:passwd ftp://ip:port/path/file
    或者大家熟悉的
    curl ftp://name:passwd@ip:port/path/file

    10)
    说完了下载,接下来自然该讲上传咯
    上传的option是 -T

    比如我们向ftp传一个文件: curl -T localfile -u name:passwd ftp://upload_site:port/path/

    当然,向http服务器上传文件也可以
    比如 curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi
    注意,这时候,使用的协议是HTTP的PUT method

    刚才说到PUT,嘿嘿,自然让老服想起来了其他几种methos还没讲呢!
    GET和POST都不能忘哦。

    http提交一个表单,比较常用的是POST模式和GET模式

    GET模式什么option都不用,只需要把变量写在url里面就可以了
    比如:
    curl http://www.yahoo.com/login.cgi?user=nickwolfe&password=12345

    而POST模式的option则是 -d

    比如,curl -d "user=nickwolfe&password=12345" http://www.yahoo.com/login.cgi
    就相当于向这个站点发出一次登陆申请~~~~~

    到底该用GET模式还是POST模式,要看对面服务器的程序设定。

    一点需要注意的是,POST模式下的文件上的文件上传,比如
    <form. method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi">
    <input type=file name=upload>
    <input type=submit name=nick value="go">
    </form>
    这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:
    curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

    罗罗嗦嗦讲了这么多,其实curl还有很多很多技巧和用法
    比如 https的时候使用本地证书,就可以这样
    curl -E localcert.pem https://remote_server

    再比如,你还可以用curl通过dict协议去查字典~~~~~
    curl dict://dict.org/d:computer

    今天就先讲到这里吧,呵呵。疯狂的curl功能,需要你---一起来发掘。

    copyright by nickwolfe@CCF
    2004.08.24 21:24应朋友之邀所作--初稿




  • 把ruby脚本转换为exe文件

    2009-05-15 21:55:36

    写出来的ruby脚本,交给别人的话,还要让别人安装ruby,就太麻烦了。
    使用exerb可以轻松的把ruby代码转换为exe文件。

    exerb会跟踪脚本的执行,然后把相应的需要的库集成到exe文件中。里面肯定是包含了一个小小的ruby解析器了。

    用法

    mkexy test.rb
    exerb test.exy 
    就会生成exe文件了。可能还有点大,你可以使用upx,aspack等压缩工具进行压缩下就ok了。
    虽然大了点,但是将就着使用了。



    接触ruby的第一件头痛的事情。以后要受制于日本人了。呵呵。无奈公司选择了ruby。

    $Id: README.en.txt,v 1.1 2006/06/20 01:51:20 yuya Exp $

     Exerb is the software which converts scripts and extension-libraries of Ruby
    into an executable file of Microsoft Windows which can execute alone and
    independently.

    ...but, I'm sorry. The English documentation is under construction.
    If you want any information about Exerb, please read the following URI.

    http://www.google.com/search?q=Exerb

    Thanks.

  • 我的第一个ruby脚本

    2009-05-15 20:40:42

    有个项目组成员,在讨论数据难以处理。
    需要把一个文件中的所有与化工有关的词全部标注起来。用个中括号括起来即可。
    因为数据量比较大,他们需要申请资源做一个月。
    最短也需要一个星期。
    我想这完全是技术问题啊。很简单的东西,于是,就私下和他联系。要了处理,使用ruby写了个小脚本。

    学习ruby很久了。但是还是一直用python写东西。很少用ruby的。这是我转ruby以来的第一次写应用脚本。比较有纪念意义。呵呵。
    代码如下。超级简单。

    最近用shell用的太多了。本来想用python写的,结果python都忘记的差不多了。
    现在,公司里用ruby比较多,而且ruby比python有不少优点,还是锻炼下ruby吧。


    def kk(c,d)
        f_new=File.new('new.csv', 'w')
        IO.foreach(d) {
            |dline|
            dline.strip!
            IO.foreach(c) {
                |cline|
                cline.strip!
                dline.gsub!(cline, "["+cline+"]")           
            }
            puts "dline= "+dline
            f_new.puts(dline)
        }
    end
    kk('D:\Work\文档\c.csv','D:\Work\文档\d.csv')

  • 编码与解码的基础知识

    2009-05-08 19:35:29

    从今天开始,打算把自己做过的分享全部列出来。
    做过纪念。也好去看自己做了什么有意义的事情。


    本次例会,给同事们分享了一下编码与解码的基础知识。
    提供给不了解的人作为参考,高手飘过。
  • LoadRunner与watir的妙用

    2009-05-08 10:54:06

    决定使用loadrunner构造一个黑客常用的注入工具。我相信,这个工具比其他任何黑客工具都好用。不仅可以进行注入,还可以进行xss的探测。甚至还可以回放。呵呵。
    watir更有趣,可以更形象的观察每一步的变化。

    利用这个机会,去强化一下loadrunner和watir的知识。
    不要以为好久不用,变的生疏了。


1724/9<123456789>
Open Toolbar