使用wget和ftp共享文件
一、需求
有一个机器A,上面那有很多文件。现在新买一个机器B,不想用U盘复制,就想把A弄成个服务器,然后B登录到A,想要什么文件就下载什么文件。
二、Win7实现
A是Win7和Ubuntu双系统,首先在Win7上,用系统自带的ftp服务器(传送门),可以实现文件下载。通过建立虚拟目录的方法,可以把不同盘里边的文件链接到ftp服务器得根目录,然后在B上输入ftp://192.168.1.101:21(B机器的ip和默认ftp端口)就可以访问A机器上的ftp服务器目录,点击文件就能下载,或者右击使用迅雷下载也行。注意两点,一个是防火墙,我是把防火墙关了B才能访问到A机器。另一点是,除了本身指定的服务器目录,新添加的虚拟目录中的文件可能没有权限下载。具体的安全配置有待深入。
三、Ubuntu 实现
今天把A进到Ubuntu下,B也进入Ubuntu,想在linux试一下ftp文件共享。首先在A机器上装一个vsftpd
$ sudo apt-get install vsftpd
装好了之后,查看是否打开21端口
$ sudo netstat -npltu | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 15601/vsftpd
看home目录下是否有一个ftp文件夹,没有的话新建一个,然后修改配置文件
$ sudo vim /etc/vsftpd.conf
在最后加入一句
local_root=/home/ftp
设置服务器的根目录
除了手动指定的这个目录外,vsftpd还建立了 /srv/ftp 这个目录。这个目录是匿名用户访问的目录。访问手动指定的目录是需要账户和密码的。在机器A(装有vsftpd服务器的机子)上,浏览器输入本机地址:ftp://192.168.1.101,进入的页面便是匿名用户访问的 /srv/ftp目录。如果在A的终端中输入
$ ftp localhost
会让你输入用户名和密码(系统的账户和密码),进去之后,会发现是 /home/ftp 这个目录。
【如果不能访问,检查一下配置文件里 local_enable=YES 和 anonymous_enable=YES 这两句是否被注释掉了。更多的关于vsftpd.conf参看ubuntu论坛 或者自己 man 5 vsftpd.conf】
配置好之后,在B机器的浏览器输入A机器的地址ftp://192.168.1.101,进去的是机器B的 /srv/ftp 目录,即匿名用户访问的目录。这个目录上的文件可以下载。但是,当我天真的把其他分区(比如Win7上的F盘)挂载到这个目录下,这个目录就打不开了。还是权限的问题,因为你是匿名访问。下面我们使用终端登录。
在B机器的终端中输入
$ ftp 192.168.1.101
然后会让你输入账户和密码。输入A机器的账户和密码之后,进到 /home/ftp 目录下(如果账户名输入anonymous,输入密码时直接回车,则仍进入匿名用户访问目录)。回到机器A上,用以下命令把Win7上的分区E盘(这个盘已经挂载到Ubuntu的/media目录下)“绑定挂载“到 /home/ftp目录
$ sudo mount --bind /media/E /home/ftp
然后再在B机器上访问A,就能在B机器上看到A机器的E盘上的文件。怎么获取这些文件呢。有get和mget两个命令可以使用。更多命令可以在ftp提示符下输入help或者? 浏览,想查看某条命令的具体用法,输入help + 命令或者 ?+命令,例如
ftp> help get
get receive file
mget命令可以一次获取多个文件,在使用mget之前,用prompt off关闭提示,不然复制每一个文件之前会询问你是否复制
prompt off
ftp> mget *.*
get下来的文件会在当前目录下。
四、神器wget
虽然mget可以同时get多个文件,但是不能处理文件夹,要想递归的复制文件夹,就需要wget了。
$ wget -m --restrict-file-names=nocontrol ftp://192.168.1.101 --ftp-user=kitty --ftp-password=123456
解释一下参数:
-m的意思是 表示镜像指定的目录 等同于 -r -N -l inf --no-remove-listing
--restrict-file-names解决中文乱码问题
例子1:wget -r ftp://xxx/ccc/aa/bb/ -P /home/work -nH --cut-dirs=2
//加上 –cut-dirs=n 忽略n个目录
//加上 -P dir 指定文件夹dir
例子2:传送门
wget -r -p -np -k -P ~/tmp/ http://java-er.com
wget居然有如此邪恶的用法
这个语句表示下载全站资料
等于把一个网站整个静态化到本地。
解释一下参数
-P 表示下载到哪个目录
-r 表示递归下载
-np 表示不下载旁站连接.
-k 表示将下载的网页里的链接修改为本地链接.
-p 获得所有显示网页所需的元素
额外的
-c 断点续传
-nd 递归下载时不创建一层一层的目录,把所有的文件下载到当前目录
-L 递归时不进入其它主机,如wget -c -r www.xxx.org/
-A 指定要下载的文件样式列表,多个样式用逗号分隔
-i 后面跟一个文件,文件内指明要下载的URL
不管用get还是wget,有的文件即使你copy到服务器目录下,仍然没有权限get它们。这时候需要改一下文件的所有者。
假如你以kitty账户登录服务器A,想把A机器上的codes文件夹wget到B机器上。如果codes文件夹的所有者不是kitty,那你需要在A机器上将codes文件夹的所有者改为kitty。
$ sudo chown -R kitty codes/
参数 -R 的意思是递归地进行,即将codes文件夹下的子文件子目录都改为kitty所有。然后就可以在机器B上get或 wget 啦。
使用wput上传文件夹:
wput /home/test ftp://ftpusername:password@ip/test
五、Ubuntu自带的“连接到服务器功能”
最后上个wget的图:因为文件小而多,所以看起来速度只有几百k,当wget几个G的iso文件时速度可以到3MB+,跟USB2.0差不多