免费注册 查看新帖 |

Chinaunix

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

[文本处理] bash socket写的wget程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-22 15:29 |只看该作者 |倒序浏览
本帖最后由 W.Z.T 于 2015-01-22 15:35 编辑

unix的一条哲学是每个命令只完成一个功能, bash却可以把他们像拼积木一样组合起来, 比如这个纯bash的http downlaoder, 可以下载binary和asiic文本, 带进度条, 目前还不支持302格式: https://github.com/cloudsec/brootkit/blob/master/brget.sh
  1. #!/bin/bash

  2. declare remote_host
  3. declare remote_port
  4. declare remote_file
  5. declare local_file
  6. declare remote_file_len=0
  7. declare curr_file_len=0
  8. declare max_col_num=64
  9. declare total_run_time

  10. function br_run_init()
  11. {
  12.         local i
  13.        
  14.         echo -ne "["
  15.         for ((i = 1; i < $max_col_num; i++))
  16.         do
  17.                 echo -ne " "
  18.         done
  19.         echo -ne "]\r"
  20. }

  21. function br_run_play()
  22. {
  23.         local i x y tmp_col

  24.         tmp_col=$((curr_file_len * max_col_num / remote_file_len))

  25.         echo -ne "["
  26.         for ((i = 1; i < $tmp_col; i++))
  27.         do
  28.                 echo -ne ">"
  29.         done
  30.         echo -ne "\r"
  31. }

  32. function br_run_finsh()
  33. {
  34.         echo -ne "\033[?25h"
  35. }

  36. function compute_run_time()
  37. {
  38.         local day hour min rtime

  39.         day=$(($1/3600/24))
  40.         hour=$(($1/3600))
  41.         min=$(($1/60))

  42.         if [ $min -eq 0 ]; then
  43.                 sec=$(($1%60))
  44.                 total_run_time="$sec s"
  45.         else
  46.                 if [ $hour -eq 0 ]; then
  47.                         sec=$(($1%60))
  48.                         total_run_time="$min m $sec s"
  49.                 else
  50.                         if [ $day -eq 0 ]; then
  51.                                 tmp=$(($1%3600))
  52.                                 min=$(($tmp/60))
  53.                                 sec=$(($tmp%60))
  54.                                 total_run_time="$hour h $min m $sec s"
  55.                         else
  56.                                 # 86400 = 3600 * 24
  57.                                 tmp=$(($1%86400))
  58.                                 hour=$(($tmp/3600))
  59.                                 tmp1=$(($tmp%3600))
  60.                                 min=$(($tmp1/60))
  61.                                 sec=$(($tmp1%60))
  62.                                 total_run_time="$day d $hour h $min m $sec s"
  63.                         fi


  64.                 fi
  65.         fi
  66. }

  67. function get_run_time()
  68. {
  69.         local run_count local_hz run_time
  70.         local start_time curr_time

  71.         if [ -d "/proc/$1" ]; then
  72.                 run_count=`cat /proc/$1/stat | cut -d " " -f 22`
  73.         else
  74.                 return 0
  75.         fi

  76.         local_hz=`getconf CLK_TCK`
  77.         start_time=$(($run_count/$local_hz))

  78.         curr_time=`cat /proc/uptime | cut -d " " -f 1 | cut -d "." -f 1`
  79.         run_time=$((curr_time-start_time))

  80.         return $run_time
  81. }

  82. function sock_read()
  83. {
  84.         local line tmp len=0 idx=0

  85.         read -u 9 -t 5 line
  86.         if ! echo $line|grep -e "200 OK" >/dev/null; then
  87.                 echo $line
  88.                 rm -f $remote_file
  89.                 socket_close
  90.                 exit
  91.         else
  92.                 echo "response 200 ok."
  93.         fi

  94.         while read -u 9 -t 5 line
  95.         do
  96.                 if [ ${#line} -eq 1 ]; then
  97.                         break
  98.                 fi

  99.                 tmp=`echo $line|cut -d " " -f 1`
  100.                 if [ "$tmp" == "Content-Length:" ]; then
  101.                         remote_file_len=`echo $line|cut -d " " -f 2`
  102.                 fi
  103.         done

  104.         echo -e "length: $remote_file_len\n"

  105.         br_run_init

  106.         tmp=${#remote_file_len}
  107.         ((tmp--))
  108.         remote_file_len=${remote_file_len:0:$tmp}

  109.         while [ $curr_file_len -le $remote_file_len ]
  110.         do
  111.                 `dd bs=1024 count=1 of=$local_file seek=$idx <&9 2>/dev/null`
  112.                 ((idx++))
  113.                 curr_file_len=$((idx*1024))
  114.                 br_run_play
  115.         done

  116.         #get_run_time $
  117.         #compute_run_time $?
  118.         #echo -ne "\n$total_run_time"
  119. }

  120. function sock_write()
  121. {
  122.         local buf

  123.         buf="GET /$3 http/1.0\r\nHost: $1:$2\r\n"
  124.         echo -e $buf >&9
  125.         [ $? -eq 0 ] && echo "send http request ok." || echo "send http request failed."
  126. }

  127. function socket_create()
  128. {
  129.         exec 9<> /dev/tcp/$1/$2
  130.         [ $? -eq 0 ] && echo "connect to $1:$2 ok." || echo "connect to $1:$2 failed."
  131. }

  132. function socket_close()
  133. {
  134.         exec >&9-
  135.         [ $? -ne 0 ] && echo "close socket failed."
  136. }

  137. function parse_url()
  138. {
  139.         local url=$1

  140.         url=${url#http://}
  141.         remote_file=${url#*/}

  142.         [ -n "$2" ] && local_file=$2 || local_file=${url##*/}

  143.         remote_host=`echo $url | awk -F '/' '{print $1}'`
  144.         remote_port=`echo $remote_host | awk -F ':' '{print $2}'`
  145.         remote_host=`echo $remote_host | awk -F ':' '{print $1}'`
  146.        
  147.         [ "$remote_port" == "" ] && remote_port=80
  148. }

  149. function file_init()
  150. {
  151.         [ -f $local_file ] && rm -f $local_file || touch $local_file
  152. }

  153. function display_start()
  154. {
  155.         local tmp

  156.         tmp=`date +'%F %T'`
  157.         tmp="--$tmp-- $1"
  158.         echo -e $tmp
  159. }

  160. function display_finsh()
  161. {
  162.         local tmp

  163.         tmp=`date +'%F %T'`
  164.         tmp="\n\n--$tmp-- - $local_file saved $remote_file_len"
  165.         echo -e "$tmp"
  166. }

  167. function brget_usage()
  168. {
  169.         echo -e "$0 <http_url> [local_file]\n"
  170.         echo "exp:"
  171.         echo "$0 http://www.baidu.com/index.html"
  172.         echo "$0 http://www.baidu.com:80/index.html"
  173. }

  174. function main()
  175. {
  176.         if [ $# -eq 0 ]; then
  177.                 brget_usage $1
  178.                 exit
  179.         fi

  180.         parse_url $@

  181.         file_init
  182.         display_start $1
  183.         socket_create $remote_host $remote_port
  184.         sock_write $remote_host $remote_port $remote_file
  185.         sock_read
  186.         display_finsh
  187.         socket_close
  188. }

  189. main $@
复制代码

wget.png (13.99 KB, 下载次数: 68)

wget.png

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
2 [报告]
发表于 2015-01-22 15:42 |只看该作者
没有/dev/tcp肿麽办

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
3 [报告]
发表于 2015-01-22 19:32 |只看该作者
495616的文件下下来成了496640, 你这可执行程序能执行起来?

论坛徽章:
1
2015亚冠之柏太阳神
日期:2015-09-29 10:00:55
4 [报告]
发表于 2015-01-22 21:30 |只看该作者
用200多行写了一个wget类似效果的shell。怎么说呢,都说一个管道符顶的上万行C代码,用shell就是图省事呀。楼主有这个雅兴不如学个C吧,这种纯花拳绣腿的脚本没有什么实际意义,仅仅满足了你的一点点虚荣心而已。就好像有人用bash写个游戏,除了秀一些技巧,写的代码,几乎对你工作一点帮助都没有。

论坛徽章:
0
5 [报告]
发表于 2015-01-23 07:33 |只看该作者
回复 4# qq5910225

我觉得你好像还没有资格教育我学不学c,我写os,jvm的时候, 你还不知道在干嘛, 你的评论说明你还不懂unix,更不懂c。

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
6 [报告]
发表于 2015-01-23 09:50 |只看该作者
bash写的不错

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
7 [报告]
发表于 2015-01-23 12:19 |只看该作者
楼主有好东西拿出来给大家分享,精神可嘉,大家应该有感恩之心,互相学习互相帮助。

论坛徽章:
41
操作系统版块每日发帖之星
日期:2016-08-21 06:20:00每日论坛发贴之星
日期:2016-05-05 06:20:00操作系统版块每日发帖之星
日期:2016-05-05 06:20:00IT运维版块每日发帖之星
日期:2016-05-05 06:20:0015-16赛季CBA联赛之山西
日期:2016-04-27 08:49:00操作系统版块每日发帖之星
日期:2016-04-25 06:20:00操作系统版块每日发帖之星
日期:2016-04-17 06:23:2815-16赛季CBA联赛之吉林
日期:2016-03-25 15:46:3415-16赛季CBA联赛之四川
日期:2016-03-25 14:26:19操作系统版块每日发帖之星
日期:2016-05-27 06:20:00操作系统版块每日发帖之星
日期:2016-05-28 06:20:00IT运维版块每日发帖之星
日期:2016-08-18 06:20:00
8 [报告]
发表于 2015-01-23 16:24 |只看该作者
你试试curl这么命令好么?

论坛徽章:
1
2015亚冠之柏太阳神
日期:2015-09-29 10:00:55
9 [报告]
发表于 2015-01-26 17:15 |只看该作者
回复 5# W.Z.T

嗯嗯 你说你会开航天飞机我都信。
   

论坛徽章:
0
10 [报告]
发表于 2015-01-29 13:14 |只看该作者

回复 9# qq5910225

王军别闹了行么,os和jvm源码:https://github.com/cloudsec
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP