关闭

如何处理wget mirror网站后应用程序文件名问题

标签: filelistunixcommandserverwindows
1021人阅读 评论(0) 收藏 举报
分类:
主题:如何处理wget mirror网站后应用程序文件名问题
      By NetGuard Security Team --Chen Jun (chenjun@netguard.com.cn)
日期:2001.08.02
    众所周知,在windows下的作mirror的程序很多,功能好的也很多。 
    但是在unix如何作mirror呢?好多人并不是很清楚。其实在unix下作mirror的程序也很多,我今天讲讲使用wget来mirror 网站的后,如何转换的问题。
    wget的用法,hehe,相信大家都是很熟悉的吧。在这,还是从网上抄点用法过来吧,出处我忘记了,对于作者,I say sorry。
----------------------------------------------------------------
wget常用参数如下 (以下资讯亦可藉由执行 wget --help获得):

GNU Wget 1.5.3, 一个非交互式的网路抓档工具.
用法: wget [选项]... [URL]...

命令的引数使用长项目与短项目相同.

启动:
  -V,  --version           显示 Wget 的版本并且离开.
  -h,  --help              显示这个说明档.
  -b,  -background         在启动之後跳到背景去.
  -e,  -execute=COMMAND    执行一个 `.wgetrc' 里面的 COMMAND 指令.

纪录档与输入的档案:
  -o,  --output-file=FILE     纪录讯息到 FILE 去.
  -a,  -append-output=FILE    增加讯息到 FILE 去.
  -d,  --debug                显示除错的输出.
  -q,  --quiet                安静模式 (不输入任何讯息).
  -v,  --verbose              冗长模式 (这是内定值).
  -nv, --non-verbose          关闭 verboseness, 但不是安静模式.
  -i,  --input-file=FILE      从 FILE 读取 URL .
  -F,  --force-html           把输入的档案当作 HTML.

下载:
  -t,  --tries=NUMBER           设定重复尝试 NUMBER 次 (0 是无限制).
  -O   --output-document=FILE   把文件写到 FILE 里.
  -nc, --no-clobber             不破坏已经存在的档案.
  -c,  --continue               重新取得一个已经存在的档案.
       --dot-style=STYLE        设定取回状况的显示风格.
  -N,  --timestamping           不取回比本地旧的档案.
  -S,  --server-response        显示伺服器回应状况.
       --spider                 不下载任何东西.
  -T,  --timeout=SECONDS        设定读取时超过的时间为 SECONDS 秒.
  -w,  --wait=SECONDS           在取回档案时等待 SECONDS 秒.
  -Y,  --proxy=on/off           开启或关闭 Proxy.
  -Q,  --quota=NUMBER           设定取回档案的定额限制为 NUMBER 个.

目录:
  -nd  --no-directories            不建立目录.
  -x,  --force-directories         强制进行目录建立的工作.
  -nH, --no-host-directories       不建立主机的目录.
  -P,  --directory-prefix=PREFIX   把档案存到 PREFIX/...
       --cut-dirs=NUMBER           忽略 NUMBER 个远端的目录元件.

HTTP 选项:
       --http-user=USER       设 http 使用者为 USER.
       --http-passwd=PASS     设 http 使用者的密码为 PASS.
  -C,  --cache=on/off         提供/关闭快取伺服器资料 (正常情况为提供).
       --ignore-length        忽略 `Content-Length' 标头栏位.
       --proxy-user=USER      设 USER 为 Proxy 使用者名称.
       --proxy-passwd=PASS    设 PASS 为 Proxy 密码.
  -s,  --save-headers         储存 HTTP 标头成为档案.
  -U,  --user-agent=AGENT     使用 AGENT 取代 Wget/VERSION 作为识别代号.

FTP 选项:
       --retr-symlinks   取回 FTP 的象徵连结.
  -g,  --glob=on/off     turn file name globbing on ot off.
       --passive-ftp     使用 "passive" 传输模式.

使用递回方式的取回:
  -r,  --recursive             像是吸入 web 的取回 -- 请小心使用!.
  -l,  --level=NUMBER          递回层次的最大值 (0 不限制).
       --delete-after          删除下载完毕的档案.
  -k,  --convert-links         改变没有关连的连结成为有关连.
  -m,  --mirror                开启适合用来映射的选项.
  -nr, --dont-remove-listing   不要移除 `.listing' 档.

递回式作业的允许与拒绝选项:
  -A,  --accept=LIST                允许的扩充项目的列表.
  -R,  --reject=LIST                拒绝的扩充项目的列表.
  -D,  --domains=LIST               允许的网域列表.
       --exclude-domains=LIST       拒绝的网域列表 (使用逗号来分隔).
  -L,  --relative                   只跟随关联连结前进.
       --follow-ftp                 跟随 HTML 文件里面的 FTP 连结.
  -H,  --span-hosts                 当开始递回时便到外面的主机.
  -I,  --include-directories=LIST   允许的目录列表.
  -X,  --exclude-directories=LIST   排除的目录列表.
  -nh, --no-host-lookup             不透过 DNS 查寻主机.
  -np, --no-parent                  不追朔到起源目录.

范例一:mirror一个网站

 wget -r http://www.redhat.com

范例二:mirror一个网站下的某个目录:

 wget -r http://www.redhat.com/apps/download/
----------------------------------------------------------------

    但是在实际中,现在的网站大多数是程序+数据库的模式,不象原来的那种单独的html方式,那样get下来的文件名就是不能直接访问的。(如果没有试过mirror的,估计不知我说的是怎么一回事)
    我们举个以mirror 一个网站的子目录下的例子,来说说吧。此网站是一台Linux的机器,在他们的上面用是jsp+mysql的模式。
一、
先在你的机器上输入
wget -m -r -k -np -b --user-agent='Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)' http://www.mysite.com/solution/
      ^  ^  ^  ^   ^       ^                                                                    ^__欲mirror的网站的url
      |  |  |  |   |       |__访问网站使用的程序的标识(我不想让那个网站知道我用的是wget,要mirror他的站,所以就假冒ie4)
      |  |  |  |   |_____放到后台运行 (我可不想傻等)
      |  |  |  |___ 限制在当前目录下的文件(如果不设,你就死定了)
      |  |  |__转换连接(但是我没有感觉有多大的用)
      |  |__递归抓取        
      |__这个要用呀,是作mirror呀
然后你先出去转转,等时间差不多了,再回来吧
二、wget结束后,你会发现,那些list.jsp?id=什么什么的,都wget了下来,文件名就是list.jsp?id=xxx存放着。
    类似这种:
    -rw-r--r--    1 root     root        30588 Jul 31 18:49 showfom.jsp?i=1525
    wget到没有错,可是在我们的机器上是不能直接访问的,这种文件名在win下也不能使用。unix对它支持,可是在apache或别的web server上不能正常访问。
    如访问 http://192.168.0.1/mirror/www.mysite.com/solution/showfom.jsp?i=1525,我们的web server会认为请求showfom.jsp文件,?后面是参数,所以造成我们不能直接访问。
    说了这么半天,这才说到我要说的,就是我们如何处理这种情况。(唉,悲哀)
三、转换
    经过对测试,发现可以通过把?转换成@后,webserver可以正常访问。
    即http://192.168.0.1/mirror/www.mysite.com/solution/showfom.jsp?i=1525改成http://192.168.0.1/mirror/www.mysite.com/solution/showfom.jsp@i=1525
    明白了这个,我们就可以编写两个脚本来实现。
1.批量改文件名
$cat >/var/tmp/s.sh
#!/bin/sh  
FILES=`ls`  
for i in $FILES ; do  
  j=`echo $i | sed "s/?/@/"`  
  mv $i $j  
done  

2.替换掉文件内容中的提示
$cat >/var/tmp/s1.sh
#!/bin/sh
cat $1 |sed s/.jsp?/.jsp@/ >1.bak
mv 1.bak $1

这两个脚本主要是利用sed的替换功能
sed s/.jsp?/.jsp@/
    |   |     |__欲改成的信息
    |   |__须换掉的信息
    |__发现并替换

如果是cgi?换成cgi@,asp?换成asp@,php?换成php@,具体看情况而变。

#cd /www/mirror/solution/
先把文件名改过来
#/var/tmp/s.sh
mv: `historylist.jsp' and `historylist.jsp' are the same file
mv: `index.html' and `index.html' are the same file

hehe,这就是不用改名的文件,我们通过分析文件,了解通过这两个文件调用才能显示文章

把index.htm或个别文件的内容作过滤
# /var/tmp/s1.sh index.html 
# /var/tmp/s1.sh historylist.jsp 


过滤完后,我们现在输入http://192.168.0.1/mirror/www.mysite.com/solution/,然后看看,是不是出来了,再点links,都正常访问了,Ok.
在此先谢谢eist,e4gle的帮助。
注:此文很乱,可取的就只一点:就是把?替换成@,让web server能正常识别。hehe,大家不要笑我哟。
如有不足,请指教;如有兴趣,快来交流。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:239736次
    • 积分:3793
    • 等级:
    • 排名:第9838名
    • 原创:101篇
    • 转载:29篇
    • 译文:12篇
    • 评论:54条
    访客信息
    Map
    最新评论