Shell提问板

平时比较喜欢写shell脚本, 也希望能帮到更多的人, 故就弄个shell提问板, 尽自己所能, 回答所知道的shell脚本问题, 一起探讨shell脚本问题。

提问规则
1. 莫问需要上百行甚至上千上万行才能完成的shell脚本, 不是能力问题, 而是时间问题
2. 莫把作业题发上来, 这里是讨论的地方,不是给人做题的地方
3. 把问题的输入输出给全, 把问题描述清楚, 以免搞错方向

6 条评论 于 “Shell提问板”

  • 思绪纷飞

    请教你个问题哈~
    我想用shell写一个脚本来实现 :自动提交表单登录系统(.net)然后抓取登陆后的页面。
    功能很简单,G了下发现curl可以实现,但我一直没有成功…
    小I有没什么好的方法呢?

    [回复]

    igi 回复:

    curl肯定是可以的,而且也不难,我给个例子吧。
    以登录hi.baidu.com为例
    ——————————————————————–
    #!/bin/bash
    HOST=”https://passport.baidu.com/?login”
    COOKIE=”/tmp/xxx.cookie”
    HEAD=’Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)’

    USER=”igi_sysu”
    PASS=”nomypass”

    # Login
    curl -A “$HEAD” -c $COOKIE -d “username=$USER” -d “password=$PASS” $HOST >/dev/null 2>&1

    #use cookie
    curl -A “$HEAD” -b $COOKIE -o cook.html ‘http://hi.baidu.com/igi_sysu/space#’
    #no use cookie
    curl -A “$HEAD” -o nocook.html ‘http://hi.baidu.com/igi_sysu/space#’
    ——————————————————————–
    解释下用法
    很多登录页面登录后,都是靠cookie来记录当前登录情况,这样在带着cookie访问时,可以不需要再次输入帐号密码。
    curl可以在登录页面是,存储服务器返回的cookie
    -c 选项指定了存储cookie的文件
    -d 需要POST的内容, 这个需要根据form的类型(post或get)来决定,如果是POST,则需要使用-d参数,如果是GET,需要使用-F参数,-d后面的username=,这个username字段是输入框的name,password同理
    最后的url,并不是我们访问的页面,而是form中指定的登录地址

    完成登录后,就可以带着cookie去访问你要访问的页面,使用-b参数读取cookie

    [回复]

    igi 回复:

    同样,wget也是可行的
    ————————————————–
    #!/bin/bash

    HOST=”https://passport.baidu.com/?login”
    COOKIE=”/tmp/xxx.cookie”

    USER=”igi_sysu”
    PASS=”nomypass”

    # Login
    wget –keep-session-cookies –save-cookies=$COOKIE -O /dev/null –post-data=”username=$USER&password=$PASS” $HOST

    wget –keep-session-cookies –load-cookies=$COOKIE -O wget-cook.html ‘http://hi.baidu.com/igi_sysu/space#’

    [回复]

  • fracting

    中大08师弟前来观摩学习~望师兄指教~
    在ubuntu下,默认情况下,浏览器会的下载目录是~/Download.
    这样一来,不管下载什么东西,都会塞在Download文件夹里面.
    我想写一个脚本,将Download文件夹里的东西自动分类,移动到不同的文件夹中.
    用file命令可以判断文件类型,再用mv命令移动到相应类型的新文件夹里,脚本就基本上完成了.
    但是现在有两个问题我不知怎么解决:
    1.如何做到实时监控Download文件夹呢?
    我想到用crontab,可是crontab每分钟只执行一次,不是真正的实时.
    2.如何判断一个文件是正在下载还是已经下载完毕呢?

    谢谢!

    [回复]

    igi 回复:

    1.如何实时监控?
    crontab 不够实时,即使自己让脚本sleep很短时间,也不是真的实时。实际上linux 2.6内核有一个inotify的接口,有个工具包inotify-tools就提供了调用这个接口的命令行工具:inotifywait和inotifywatch.
    鉴于你的需求,inotifywait更适合你的应用,例如监控download目录新建文件的事件
    inotifywait -r -e create -format ‘%e %f’ download

    2.如果判断一个文件是在下载还是下载完毕?
    下载的情况有很多,如果一个文件从下载开始到下载结束的过程中并未中断,且一次性完成,那只要用上面提到的工具监控close信号就行
    但实际应用中往往会有断点续传的要求,此时系统无法判断出文件是否完成,这个工作该由下载工具做,下载工具自己会判断文件大小来判断是否完成,当然有些工具能有md5等校验功能,这也需要服务器端支持才行
    所以你可以自己用脚本写下载工具,这样啥时候下载完就一清二楚了

    [回复]

  • 可惜没研究过shell,所以不能提出什么问题,但是要非常支持博主的热心肠,通过博主的每篇文章,可知是个非常认证仔细的程序高手。

    [回复]

添加评论