Total Pageviews

Saturday, 16 December 2017

如何处理用wget对网站做镜像后,应用程序文件名的问题

在unix下,如何作网站的mirror呢?好多人并不是很清楚。其实在unix下作mirror的程序也很多,现在讲讲使用wget来mirror网站之后,如何转换应用程序文件名的问题。

wget的用法:

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' andhistorylist.jsp' are the same file
mv: index.html' andindex.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,大家不要笑我哟。

No comments:

Post a Comment