1、FTP服务器的简介
关于ftp的介绍,大家也一定不陌生了。我就直接把百度百科上的介绍拿过来,和大家一起温习一下概念。
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
2、LINUX下FTP服务器的搭建
一般在各种linux的发行版中,默认带有的ftp软件是vsftp,从各个linux发行版对vsftp的认可可以看出,vsftp应该是一款不错的ftp软件。
(1)检查vsftpd软件是否安装
使用如下命令可以检测出是否安装了vsftpd软件,rpm -qa |grep vsftpd ,例如在我的centos 5.6中显示的结果如下:
如果没有安装的话,可以下载安装,也可以使用软件源进行安装。这里不再赘述。
(2)vsftpd软件的使用
使用vsftpd软件,主要包括如下几个命令:
启动ftp:service vsftpd start
停止ftp:service vsftpd stop
重启ftp:service vsftpd restart
或者使用带有路径的命令:
(3)vsftpd的配置
ftp的配置文件主要有三个,在centos5.6中位于/etc/vsftpd/目录下,分别是:
ftpusers 该文件用来指定那些用户不能访问ftp服务器。
user_list 该文件用来指示的默认账户在默认情况下也不能访问ftp
vsftpd.conf vsftpd的主配置文件
(4)下面我们使用vi编辑vsftpd.conf文件
用户登录控制:
anonymous_enable=YES,允许匿名用户登录。
no_anon_password=YES,匿名用户登录时不需要输入密码。
local_enable=YES,允许本地用户登录。
deny_email_enable=YES,可以创建一个文件保存某些匿名电子邮件的黑名单,以防止这些人使用Dos攻击。
banned_email_file=/etc/vsftpd/banned_emails,保存电子邮件黑名单的目录(默认)
用户权限控制:
write_enable=YES,开启全局上传
local_umask=022,本地文件上传的umask设置为022,系统默认。
anon_upload_enable=YES,允许匿名用户上传,当然要在write_enable=YES的情况下。同时必须建立一个允许ftp用户读写的目录。
anon_mkdir_write_enable=YES,允许匿名用花创建目录
chown_uploads=YES,匿名用户上传的文件属主转换为别的用户,一般建议为root。
chown_username=whoever,改此处的whoever为要转换的属主,建议root
chroot_list_enable=YES,用一个列表来限定哪些用户只能在自己目录下活动。
chroot_list_enable=/etc/vsftpd/chroot_list,指定用户列表文件
nopriv_user=ftpsecure,指定一个安全账户,让ftp完全隔离和没有特权的账户
其他的建议不要配置。
用户连接和超时设置:
idle_session_timeout=600,默认的超时时间
data_connection_timeout=120,设置默认数据连接的超时时间
(4)服务器日志和欢迎信息
dirmessage_enable=YES,允许为配置目录显示信息
ftpd_banner=Welcome to blah FTP service.ftp的欢迎信息
xferlog_enable=YES 打开日志记录功能
xferlog_file=/var/log/xferlog 日志记录文件的位置
我们可以更改以上的各个设置,然后重启ftp服务就可以实现对ftp的配置了。
Ftp命令的功能是在本地机和远程机之间传送文件。该命令的一般格式如下:
FTP常用命令
c:>ftp 主机名/IP
最常用的命令有:
ls 列出远程机的当前目录
cd 在远程机上改变工作目录
lcd 在本地机上改变工作目录
ascii 设置文件传输方式为ASCII模式
binary 设置文件传输方式为二进制模式
close 终止当前的ftp会话
hash 每次传输完数据缓冲区中的数据后就显示一个#号
get(mget)从远程机传送指定文件到本地机
put(mput)从本地机传送指定文件到远程机
open 连接远程ftp站点
quit 断开与远程机的连接并退出ftp
? 显示本地帮助信息
简单介绍一下实现吧:
public:
CInternetSession* m_pInetSession;
CFtpConnection* m_pFtpConnection;
//CInternetSession和 CFtpConnection 类包含在afxinet.h头文件中
第一步:建立ftp连接
m_pInetSession = new CInternetSession( AfxGetAppName(), 1,
PRE_CONFIG_INTERNET_ACCESS);
try{
m_pFtpConnection = m_pInetSession->
GetFtpConnection(addr, username, password, port);
// addr ftp服务器的地址 LPCTSTR
// username 登陆用户名 LPCTSTR
// password 密码 LPCTSTR
//port 端口 UINT
}
//若登陆不成功则抛出异常,以下是针对异常的处理
catch(CInternetException *pEx){
TCHAR szError[1024] = {0};
if(pEx->GetErrorMessage(szError,1024))
AfxMessageBox(szError);
else
AfxMessageBox(_T("There was an exception"));
pEx->Delete();
m_pFtpConnection = NULL;
return;
}
第二步:发送文件
为了确保在发送的时候,还能够进行其他的操作,所以程序中需要一个文件发送线程,以保证良好的交互性。
首先声明一个线程执行函数:
static UINT PutFile(LPVOID pFtp);
此函数的实现如下,很简单。
UINT PutFile(LPVOID pFtp)
{
CFtpConnection* FtpConnection = (CFtpConnection*)pFtp;
if(FtpConnection->
PutFile(_T("c:/test.txt"), _T("test.txt"))){
MessageBox(NULL, _T("发送成功!"), _T("提示"), MB_OK);
//第一个参数为本地文件的地址,第二个为服务器端文件的地址
return 1;
}
else{
MessageBox(NULL, _T("发送失败!"), _T("提示"), MB_OK);
return 0;
}
}
在主线程里开启上传线程:
CWinThread* th;
th = AfxBeginThread( PutFile, this,
THREAD_PRIORITY_NORMAL, CREATE_SUSPENDED);
th->m_bAutoDelete = FALSE;
th->ResumeThread();
需要说明的是,这里上传功能设计得非常简单。只使用了一个PutFile函数。这个函数封装了服务器端文件上传、写入和关闭等操作,所以本程序并不支持断线续传。如果想使程序支持断线续传,则需要是用CFtpConnection类中的OpenFile函数打开文件,然后使用CInternetFile类的函数来对文件进行读写控制。
第三步:断开连接
没有什么可说明的。
if(m_pFtpConnection != NULL)
{
m_pFtpConnection->Close();
delete m_pFtpConnection;
}
delete m_pInetSession;
int CFtpCView::FtpcmdDownfile()
{
if(NULL==m_pFtpConn) return-1;
CString str;
str =_T("\\");
if (!m_pFtpConn->SetCurrentDirectory(str) ) return-2;
str =_T("FileList.txt");
CFtpFileFind finder(m_pFtpConn);
if (finder.FindFile(str) )
{
if (!m_pFtpConn->GetFile( str ,_T("E:\\temp\\")+str,FALSE,FILE_ATTRIBUTE,FTP_TYPE_BINARY|INTERNET_FLAG_NO_CACHE_WRITE,0))
return-3;
}
else
return-4;
return 1;
}