Linux里面FTP主被动模式区别是什么?
题主你好,
首先要说的是FTP的通信是由两部分组成的: 发送命令 + 传输数据.
换种说法就是: 发送命令 与 传输数据 是走的两条道(不同的tcp连接).
发送命令 这条道方向是固定的, 总是由客户端向服务端发起请求把这条道铺起来.
而 传输数据 这条道方向就不是固定的了, 可能与 发送命令 一样, 也是由客户端向服务端发起请求, 还可能是反向的,即由服务端向客户端发起请求来铺起传输数据的这条道.
而题主的问题里所说的FTP主动被模式其实指的就是 传输数据 这条道的铺设到底是 谁向谁发起请求 这里的主被动是根据 服务端 来说的, 即 服务端主动向客户端发起的就是所谓的主动模式, 反之, 客户端向服务端发起的(服务端被连接),即是被动模式
最后再说下区别: 一开始的ftp只有主动模式,即服务端主动向客户端发请求建立连接,然后利用建立的这个连接进行数据传输. 但后来客户端这边的防火墙很多时候为了安全考虑只相信自己向外发送的请求, 不相信外面连进来的请求,会把从外向内的请求给截断,说白了就是数据传输这条道没建成, 数据肯定就传输不了的. 所以后来又开发了被动模式,让客户端主动向服务端发请求建立连接, 这样防火墙一看是从自己家主动发出去的,就不会拦截,这样路铺好了, 数据自然能成功传输了.
写在最后: 希望可以帮到题主, 欢迎追问.
linux配置ftp
package?com.weixin.util;
import?java.io.File;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.InputStream;
import?java.io.OutputStream;
import?java.io.PrintWriter;
import?java.io.RandomAccessFile;
import?org.apache.commons.net.PrintCommandListener;
import?org.apache.commons.net.ftp.FTP;
import?org.apache.commons.net.ftp.FTPClient;
import?org.apache.commons.net.ftp.FTPFile;
import?org.apache.commons.net.ftp.FTPReply;
import?com.weixin.constant.DownloadStatus;
import?com.weixin.constant.UploadStatus;
/**
*?支持断点续传的FTP实用类 *?@version?0.1?实现基本断点上传下载 *?@version?0.2?实现上传下载进度汇报 *?@version?0.3?实现中文目录创建及中文文件创建,添加对于中文的支持 */public?class?ContinueFTP?{
public?FTPClient?ftpClient?=?new?FTPClient();
public?ContinueFTP(){
//设置将过程中使用到的命令输出到控制台
this.ftpClient.addProtocolCommandListener(new?PrintCommandListener(new?PrintWriter(System.out)));
}
/**
?*?连接到FTP服务器
?*?@param?hostname?主机名
?*?@param?port?端口
?*?@param?username?用户名
?*?@param?password?密码
?*?@return?是否连接成功
?*?@throws?IOException
?*/
public?boolean?connect(String?hostname,int?port,String?username,String?password)?throws?IOException{
ftpClient.connect(hostname,?port);
ftpClient.setControlEncoding("GBK");
if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){
if(ftpClient.login(username,?password)){
return?true;
}
}
disconnect();
return?false;
}
/**
?*?从FTP服务器上下载文件,支持断点续传,上传百分比汇报
?*?@param?remote?远程文件路径
?*?@param?local?本地文件路径
?*?@return?上传的状态
?*?@throws?IOException
?*/
public?DownloadStatus?download(String?remote,String?local)?throws?IOException{
//设置被动模式
ftpClient.enterLocalPassiveMode();
//设置以二进制方式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
DownloadStatus?result;
//检查远程文件是否存在
FTPFile[]?files?=?ftpClient.listFiles(new?String(remote.getBytes("GBK"),"iso-8859-1"));
if(files.length?!=?1){
System.out.println("远程文件不存在");
return?DownloadStatus.Remote_File_Noexist;
}
long?lRemoteSize?=?files[0].getSize();
File?f?=?new?File(local);
//本地存在文件,进行断点下载
if(f.exists()){
long?localSize?=?f.length();
//判断本地文件大小是否大于远程文件大小
if(localSize?>=?lRemoteSize){
System.out.println("本地文件大于远程文件,下载中止");
return?DownloadStatus.Local_Bigger_Remote;
}
//进行断点续传,并记录状态
FileOutputStream?out?=?new?FileOutputStream(f,true);
ftpClient.setRestartOffset(localSize);
InputStream?in?=?ftpClient.retrieveFileStream(new?String(remote.getBytes("GBK"),"iso-8859-1"));
byte[]?bytes?=?new?byte[1024];
long?step?=?lRemoteSize?/100;
long?process=localSize?/step;
int?c;
while((c?=?in.read(bytes))!=?-1){
out.write(bytes,0,c);
localSize+=c;
long?nowProcess?=?localSize?/step;
if(nowProcess?>?process){
process?=?nowProcess;
if(process?%?10?==?0)
System.out.println("下载进度:"+process);
//TODO?更新文件下载进度,值存放在process变量中
}
}
in.close();
out.close();
boolean?isDo?=?ftpClient.completePendingCommand();
if(isDo){
result?=?DownloadStatus.Download_From_Break_Success;
}else?{
result?=?DownloadStatus.Download_From_Break_Failed;
}
}else?{
OutputStream?out?=?new?FileOutputStream(f);
InputStream?in=?ftpClient.retrieveFileStream(new?String(remote.getBytes("GBK"),"iso-8859-1"));
byte[]?bytes?=?new?byte[1024];
long?step?=?lRemoteSize?/100;
long?process=0;
long?localSize?=?0L;
int?c;
while((c?=?in.read(bytes))!=?-1){
out.write(bytes,?0,?c);
localSize+=c;
long?nowProcess?=?localSize?/step;
if(nowProcess?>?process){
process?=?nowProcess;
if(process?%?10?==?0)
System.out.println("下载进度:"+process);
//TODO?更新文件下载进度,值存放在process变量中
}
}
in.close();
out.close();
boolean?upNewStatus?=?ftpClient.completePendingCommand();
if(upNewStatus){
result?=?DownloadStatus.Download_New_Success;
}else?{
result?=?DownloadStatus.Download_New_Failed;
}
}
return?result;
}
/**
?*?上传文件到FTP服务器,支持断点续传
?*?@param?local?本地文件名称,绝对路径
?*?@param?remote?远程文件路径,使用/home/directory1/subdirectory/file.ext?按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构
?*?@return?上传结果
?*?@throws?IOException
?*/
public?UploadStatus?upload(String?local,String?remote)?throws?IOException{
//设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
//设置以二进制流的方式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("GBK");
UploadStatus?result;
//对远程目录的处理
String?remoteFileName?=?remote;
if(remote.contains("/")){
remoteFileName?=?remote.substring(remote.lastIndexOf("/")+1);
//创建服务器远程目录结构,创建失败直接返回
if(CreateDirecroty(remote,?ftpClient)==UploadStatus.Create_Directory_Fail){
return?UploadStatus.Create_Directory_Fail;
}
}
//检查远程是否存在文件
FTPFile[]?files?=?ftpClient.listFiles(new?String(remoteFileName.getBytes("GBK"),"iso-8859-1"));
if(files.length?==?1){
long?remoteSize?=?files[0].getSize();
File?f?=?new?File(local);
long?localSize?=?f.length();
if(remoteSize==localSize){
return?UploadStatus.File_Exits;
}else?if(remoteSize?>?localSize){
return?UploadStatus.Remote_Bigger_Local;
}
//尝试移动文件内读取指针,实现断点续传
result?=?uploadFile(remoteFileName,?f,?ftpClient,?remoteSize);
//如果断点续传没有成功,则删除服务器上文件,重新上传
if(result?==?UploadStatus.Upload_From_Break_Failed){
if(!ftpClient.deleteFile(remoteFileName)){
return?UploadStatus.Delete_Remote_Faild;
}
result?=?uploadFile(remoteFileName,?f,?ftpClient,?0);
}
}else?{
result?=?uploadFile(remoteFileName,?new?File(local),?ftpClient,?0);
}
return?result;
}
/**
?*?断开与远程服务器的连接
?*?@throws?IOException
?*/
public?void?disconnect()?throws?IOException{
if(ftpClient.isConnected()){
ftpClient.disconnect();
}
}
/**
?*?递归创建远程服务器目录
?*?@param?remote?远程服务器文件绝对路径
?*?@param?ftpClient?FTPClient对象
?*?@return?目录创建是否成功
?*?@throws?IOException
?*/
public?UploadStatus?CreateDirecroty(String?remote,FTPClient?ftpClient)?throws?IOException{
UploadStatus?status?=?UploadStatus.Create_Directory_Success;
String?directory?=?remote.substring(0,remote.lastIndexOf("/")+1);
if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(new?String(directory.getBytes("GBK"),"iso-8859-1"))){
//如果远程目录不存在,则递归创建远程服务器目录
int?start=0;
int?end?=?0;
if(directory.startsWith("/")){
start?=?1;
}else{
start?=?0;
}
end?=?directory.indexOf("/",start);
while(true){
String?subDirectory?=?new?String(remote.substring(start,end).getBytes("GBK"),"iso-8859-1");
if(!ftpClient.changeWorkingDirectory(subDirectory)){
if(ftpClient.makeDirectory(subDirectory)){
ftpClient.changeWorkingDirectory(subDirectory);
}else?{
System.out.println("创建目录失败");
return?UploadStatus.Create_Directory_Fail;
}
}
start?=?end?+?1;
end?=?directory.indexOf("/",start);
//检查所有目录是否创建完毕
if(end?0){
ftpClient.setRestartOffset(remoteSize);
process?=?remoteSize?/step;
raf.seek(remoteSize);
localreadbytes?=?remoteSize;
}
byte[]?bytes?=?new?byte[1024];
int?c;
while((c?=?raf.read(bytes))!=?-1){
out.write(bytes,0,c);
localreadbytes+=c;
if(localreadbytes?/?step?!=?process){
process?=?localreadbytes?/?step;
System.out.println("上传进度:"?+?process);
//TODO?汇报上传状态
}
}
out.flush();
raf.close();
out.close();
boolean?result?=ftpClient.completePendingCommand();
if(remoteSize?>?0){
status?=?result?UploadStatus.Upload_From_Break_Success:UploadStatus.Upload_From_Break_Failed;
}else?{
status?=?result?UploadStatus.Upload_New_File_Success:UploadStatus.Upload_New_File_Failed;
}
return?status;
}
public?static?void?main(String[]?args)?{
ContinueFTP?myFtp?=?new?ContinueFTP();
try?{
System.err.println(myFtp.connect("10.10.6.236",?21,?"5",?"jieyan"));
// myFtp.ftpClient.makeDirectory(new?String("歌曲".getBytes("GBK"),"iso-8859-1"));
// myFtp.ftpClient.changeWorkingDirectory(new?String("歌曲".getBytes("GBK"),"iso-8859-1"));
// myFtp.ftpClient.makeDirectory(new?String("爱你等于爱自己".getBytes("GBK"),"iso-8859-1"));
// System.out.println(myFtp.upload("E:\\yw.flv",?"/yw.flv",5));
// System.out.println(myFtp.upload("E:\\爱你等于爱自己.mp4","/爱你等于爱自己.mp4"));
//System.out.println(myFtp.download("/爱你等于爱自己.mp4",?"E:\\爱你等于爱自己.mp4"));
myFtp.disconnect();
}?catch?(IOException?e)?{
System.out.println("连接FTP出错:"+e.getMessage());
}
}
}
Linux下常见的FTP服务器组件有哪些?
Linux下常见的FTP服务器组件根本配置性大概可以分为三类:弱、中等、高。
功能比较简单的有ftpd和oftpd,前者与ftp客户端工具ftp类似,只有标准的功能,此外支持SSL。oftpd是一款非常小巧的匿名ftp服务器。
可配制型居中的主要是vsftpd和pure-ftpd。这两个侧重于安全、速度和轻量级,在大型ftp服务器上用得比较多,尤其是vsftpd,这类服务器对用户认证和权限控制比较简单,更注重安全型和速度。
配置性强的要数proftpd、wu-ftpd和glftpd。
suselinux怎么安装ftp?
有几种方法:
1.命令的方法:ps-aux|grepftpdnetstat-na|grep21看看有没有启动。
2.在界面模式下查看ftp服务有没有开启,比如suseLinux的,在yast中就能看到3.你用ftp软件看看能否连到系统。这方法缺点明显,要是配置错了也连不上,呵呵。建议采用第一种,直接用命令查看。
ftp连接命令?
很高兴本问题!此观点仅供参考!如有纰漏,请尽情斧正!希望可以帮助你!记得上中学时代,就对
连接ftp服务器。
格式:ftp
(1)在Linux命令行下输入:
(2)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。
linuxftp怎么上传目录?
可以,要开放目录的w也就是写权限,还有开启vsftpd的upload权限,还要把一个user_mkdir_write_enable=yes,这个user可以是anon代表匿名.然后重启服务生效,这个配置很多的,网上搜个文档会很详细说明的,绝对可以,
ftp下载命令?
1.连接ftp服务器
ftp下载命令:格式:ftp
a)在linux命令行下输入:
ftp192.168.1.1
b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。
2.下载文件
下载文件通常用get和mget这两条命令。
a)get
格式:get
将文件从远端主机中传送至本地主机中。
如要获取远程服务器上/usr/your/1.htm,则
ftp>get/usr/your/1.htm1.htm(回车)
b)mget
格式:mget
从远端主机接收一批文件至本地主机。
如要获取服务器上/usr/your/下的所有文件,则ftp>cd/usr/your/
ftp>mget*.*(回车)
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!