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

主题:如何处理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,大家不要笑我哟。
如有不足,请指教;如有兴趣,快来交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值