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

转载 2012年03月31日 09:32:56
主题:如何处理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,大家不要笑我哟。
如有不足,请指教;如有兴趣,快来交流。

Linux下安装PHP

下载  http://www.php.net/releases/ [root@hm16-214 software]# wget http://cn2.php.net/get/php-5.5.5.ta...
  • fengyily
  • fengyily
  • 2014年07月02日 16:18
  • 5673

[小技巧] wget 下载文件名为中文的文件

使用wget 去抓一个网站的文件时,有时候会碰到中文
  • robertsong2004
  • robertsong2004
  • 2014年08月27日 22:29
  • 3717

wget jdk 却是网页的解决办法

问题来源:阿里云上租了个ECS,然后想装个javaweb环境,首先得装JDK,可是wget一下,解压的时候出现了下面的问题!root@ixx:~# tar -zxvf jdk-8u65-linux-i...
  • suifengdeshitou
  • suifengdeshitou
  • 2015年10月25日 13:32
  • 342

win下安装wget以及使用wget下载整个网站或目录

1、 安装wget网址:http://gnuwin32.sourceforge.net/packages/wget.htm下载http://downloads.sourceforge.net/gnuw...
  • forever0wind
  • forever0wind
  • 2011年07月03日 17:01
  • 1913

VS2008网站转换成Web应用程序

第一步,先建一个Web应用程序 第二步: 将需要转换的项目(项目里的所有文件)复制粘贴(点击新项目右键粘贴所有文件)到先建的项目中 第三步: 如有其他类库可以添加其他类库,接着添加引用...
  • lin304510260
  • lin304510260
  • 2012年11月01日 11:21
  • 615

linux利用wget命令备份网站(镜像拷贝)

linux利用wget命令备份网站(镜像拷贝) 上篇文章写到使用curl下载上传ftp,陋室博客最近想把之前的实验页面做一个镜像站点,不过由于curl不支持递归下载,所以当要备份一个ftp服...
  • lanjianhun
  • lanjianhun
  • 2014年05月23日 09:56
  • 3678

wget 下载 保存文件名

wget –content-disposition 保存文件名
  • u012063703
  • u012063703
  • 2015年11月24日 19:44
  • 333

利用wget复制网站

曾经维护过一个网站,但是为了成本和安全性多方面的考虑,主机上只host静态网页。于是就在自己的机器上搭建wordpress环境,在本地更新内容之后,使用wget将整个网站复制下来,再上传到远程主机上。...
  • luckywqf
  • luckywqf
  • 2014年11月13日 12:07
  • 744

Linux 如何使用 wget 下载整个网站

Linux 如何使用 wget 下载整个网站近期要去缅甸呆半个月,想顺便把 W3SCHOOL.COM 上面的 HTML/CSS/JS/PHP 教程温习一遍。但是有一个问题,缅甸的网速很慢,我们住的酒店...
  • github_37483541
  • github_37483541
  • 2017年02月09日 20:29
  • 2954

如何用wget下载整个网站

如何下载整个网站 wget --mirror -p --html-extension --convert-links -e robots=off -P . http://url-to-site...
  • redmoon729
  • redmoon729
  • 2015年01月07日 14:27
  • 2177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何处理wget mirror网站后应用程序文件名问题
举报原因:
原因补充:

(最多只允许输入30个字)