windows写文件到ubuntu之ftp
1:安装ftpsudo apt-get install vsftpd
默认的ftp路径在 /srv/ftp
需要设置这个目录的权限:chmod -R 777 *
2:修改配置
/etc/vsftpd.conf
1.配置
# 设定系统本地用户账户登陆ftp
local_enable=YES
# 使用用户的本地账户目录作为ftp目录
chroot_local_user=YES
# 允许用户上传文件
write_enable=YES
修改完成后保存并重启vsftpd
sudo /etc/init.d/vsftpd restart
三. 添加ftp使用用户
sudo useradd -d /home/ftp_testuser -m ftp_testuser
sudo passwd ftp_testuser
然后就可以用ftp_testuser和设置好的密码进行登陆ftp了
2.vsftpd的环境
1} vsftp安装完成后会生成一个名字是ftp的账户,密码ftp,可以在/etc/passwd中看到,一般来说这时候可以建立一个ftp文件,自己设置的是/home/ftp,最好再把ftp改成777的权限。
2} /etc/vsftpd.conf 主要就是vsftpd的配置文件,相当重要的一个东西。
3} /etc/pam.d/vsftpd 与pam组相关的文件,pam组主要用来进行身份认证和抵御功能,初期没必要太了解这个。
4}/etc/ftpusers 这个主要是和上面的搭配,设定拒绝登陆的账号,一般都是本机上的账号,vim它,会发现root在列,这也解释了为啥子我一开始在root下老登陆不进去ftp。
5} finger ftp,这个命令主要是查看ftp这个用户的一些信息,包括登陆时间,默认家目录等等,其中,ftp这个用户的家目录会作为匿名登陆用户显示的目录(即是匿名用户的根目录)。
3.一些重要的概念以及操作
ftp localhost
这个的意思就是,以本地机器连入ftp,就是在你的Ubuntu上连入ftp啦,localhost实际上是指通过lookback接口向应用程序提供连结,localhost的IP是 127.0.0.1,你可以自己看成这个IP就是你自己电脑的IP地址,只不过是专门用来进行系统内部程序的通信用的。
chroot
change root diectry,root指的是根目录,为什么会有这个呢,因为一旦别人连入你的ftp,它可以向上级访问目录,也就是说可以访问你的任何一个文件,这个 是不好滴,所以利用chroot可以把连进来的用户限制到一个目录里面操作,它能访问这个文件夹里的一切东西,但是就是不能跳出这个文件夹访问上级目录。 这个chroot相当重要。
chown
这个是改变文件的所属用户组的命令,初级阶段不太用的上,以后会说明。
4.自己环境下vsftp的功能,以及配置。下面主要说说自己的配置,顺带说明一些功能。
vsftp的功能:
允许匿名用户登录,登陆的目录为/srv/ftp(也即是我finger ftp得到的ftp用户家目录,这个是vsftp默认的),匿名用户只拥有下载权限,不具备上传,新建文件夹等权限,并且被限制在/srv/ftp目录下,不允许查看上级目录(比如我的/ect /boot等目录)。
允许本地用户登录,本地用户就是指你Ubuntu机器上的用户,比如root,ftp,xxx用户等等,本地用户拥有所有权限,进入的默认目录是/home/ftp(所以上面说建一个这个目录),并且可以访问机器上的任何目录。
开启FTP的日志功能,记录FTP的所有操作。在vsftpd.conf中很多配置是一环扣一环的,比如说如果write_enable没有开启,那么设置upload=YES也是没有用的。慢慢学习,就会知道一些。
3:创建用户
自己建立一个ftp2用户,并修改密码
sudo useradd -g ftp -d /srv/ftp ftpa
sudo passwd ftpa
用户可以访问ftp server,正常连接,但如果禁止其不能terminal登录的话
sudo useradd -g ftp -d /srv/ftp -s /sbin/nologin ftpa
用户不能登陆,通过网上寻找发现
vsftp 会查找/etc/shells文件,以判断其用户是否包含,默认情况下Ubuntu(openbsd)中的shells 没有/sbin/nologin,所以要通过手动添加来实现
sudo vi /etc/shells
添加/sbin/nologin
此时就可以实现ftp用户登录,terminal不能登陆的效果。至于默认的ftp用户 我们可以不用,查看/etc/passwd文件可知,ftp 属于 /bin/false,也不再shells中所以不能登录。
4:开启服务
sudo /etc/init.d/vsftpd restart
5:c#FTP封装
public class FtpWeb
{
string ftpServerIP;
string ftpRemotePath;
string ftpUserID;
string ftpPassword;
string ftpURI;
///
/// 连接FTP
///
/// FTP连接地址
/// 指定FTP连接成功后的当前目录, 如果不指定即默认为根目录
/// 用户名
/// 密码
public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword)
{
ftpServerIP = FtpServerIP;
ftpRemotePath = FtpRemotePath;
ftpUserID = FtpUserID;
ftpPassword = FtpPassword;
ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
}
///
/// 上传
///
///
public void Upload(string filename)
{
FileInfo fileInf = new FileInfo(filename);
string uri = ftpURI + fileInf.Name;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;
int buffLength = 2048;
byte[] buff = new byte;
int contentLen;
FileStream fs = fileInf.OpenRead();
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close();
}
public bool Upload(string remoteFilename, byte[] FileBytes)
{
//FileInfo fileInf = new FileInfo(filename);
//string uri = ftpURI + fileInf.Name;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + remoteFilename));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = FileBytes.Length;
Stream strm = reqFTP.GetRequestStream();
using (MemoryStream mem = new MemoryStream(FileBytes))
{
byte[] buffer = new byte;
int bytesRead = 0;
int TotalRead = 0;
while (true)
{
bytesRead = mem.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
TotalRead += bytesRead;
strm.Write(buffer, 0, bytesRead);
}
strm.Close();
}
return true;
}
///
/// 下载
///
///
///
public void Download(string filePath, string fileName)
{
FtpWebRequest reqFTP;
FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte;
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}
///
/// 删除文件
///
///
public void Delete(string fileName)
{
string uri = ftpURI + fileName;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
string result = String.Empty;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
///
/// 删除文件夹
///
///
public void RemoveDirectory(string folderName)
{
string uri = ftpURI + folderName;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
string result = String.Empty;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
///
/// 获取当前目录下明细(包含文件和文件夹)
///
///
public string[] GetFilesDetailList()
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
FtpWebRequest ftp;
ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = ftp.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
//while (reader.Read() > 0)
//{
//}
string line = reader.ReadLine();
//line = reader.ReadLine();
//line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf("\n"), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
///
/// 获取当前目录下文件列表(仅文件)
///
///
public string[] GetFileList(string mask)
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string line = reader.ReadLine();
while (line != null)
{
if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
{
string mask_ = mask.Substring(0, mask.IndexOf("*"));
if (line.Substring(0, mask_.Length) == mask_)
{
result.Append(line);
result.Append("\n");
}
}
else
{
result.Append(line);
result.Append("\n");
}
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
///
/// 获取当前目录下所有的文件夹列表(仅文件夹)
///
///
public string[] GetDirectoryList()
{
string[] drectory = GetFilesDetailList();
string m = string.Empty;
foreach (string str in drectory)
{
int dirPos = str.IndexOf("");
if (dirPos > 0)
{
/*判断 Windows 风格*/
m += str.Substring(dirPos + 5).Trim() + "\n";
}
else if (str.Trim().Substring(0, 1).ToUpper() == "D")
{
/*判断 Unix 风格*/
string dir = str.Substring(55).Trim();
if (dir != "." && dir != "..")
{
m += dir + "\n";
}
}
}
char[] n = new char[] { '\n' };
return m.Split(n);
}
///
/// 判断当前目录下指定的子目录是否存在
///
/// 指定的目录名
public bool DirectoryExist(string RemoteDirectoryName)
{
string[] dirList = GetDirectoryList();
foreach (string str in dirList)
{
if (str.Trim() == RemoteDirectoryName.Trim())
{
return true;
}
}
return false;
}
///
/// 判断当前目录下指定的文件是否存在
///
/// 远程文件名
public bool FileExist(string RemoteFileName)
{
string[] fileList = GetFileList("*.*");
foreach (string str in fileList)
{
if (str.Trim() == RemoteFileName.Trim())
{
return true;
}
}
return false;
}
///
/// 创建文件夹
///
///
public void MakeDir(string dirName)
{
FtpWebRequest reqFTP;
// dirName = name of the directory to create.
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));
reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
///
/// 获取指定文件大小
///
///
///
public long GetFileSize(string filename)
{
FtpWebRequest reqFTP;
long fileSize = 0;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
fileSize = response.ContentLength;
ftpStream.Close();
response.Close();
return fileSize;
}
///
/// 改名
///
///
///
public void ReName(string currentFilename, string newFilename)
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
reqFTP.Method = WebRequestMethods.Ftp.Rename;
reqFTP.RenameTo = newFilename;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
///
/// 移动文件
///
///
///
public void MovieFile(string currentFilename, string newDirectory)
{
ReName(currentFilename, newDirectory);
}
///
/// 切换当前目录
///
///
/// true 绝对路径 false 相对路径
public void GotoDirectory(string DirectoryName, bool IsRoot)
{
if (IsRoot)
{
ftpRemotePath = DirectoryName;
}
else
{
ftpRemotePath += DirectoryName + "/";
}
ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
}
///
/// 删除订单目录
///
/// FTP 主机地址
/// FTP 用户名
/// FTP 用户名
/// FTP 密码
public static void DeleteOrderDirectory(string ftpServerIP, string folderToDelete, string ftpUserID, string ftpPassword)
{
try
{
if (!string.IsNullOrEmpty(ftpServerIP) && !string.IsNullOrEmpty(folderToDelete) && !string.IsNullOrEmpty(ftpUserID) && !string.IsNullOrEmpty(ftpPassword))
{
FtpWeb fw = new FtpWeb(ftpServerIP, folderToDelete, ftpUserID, ftpPassword);
//进入订单目录
fw.GotoDirectory(folderToDelete, true);
//获取规格目录
string[] folders = fw.GetDirectoryList();
foreach (string folder in folders)
{
if (!string.IsNullOrEmpty(folder) || folder != "")
{
//进入订单目录
string subFolder = folderToDelete + "/" + folder;
fw.GotoDirectory(subFolder, true);
//获取文件列表
string[] files = fw.GetFileList("*.*");
if (files != null)
{
//删除文件
foreach (string file in files)
{
fw.Delete(file);
}
}
//删除冲印规格文件夹
fw.GotoDirectory(folderToDelete, true);
fw.RemoveDirectory(folder);
}
}
//删除订单文件夹
string parentFolder = folderToDelete.Remove(folderToDelete.LastIndexOf('/'));
string orderFolder = folderToDelete.Substring(folderToDelete.LastIndexOf('/') + 1);
fw.GotoDirectory(parentFolder, true);
fw.RemoveDirectory(orderFolder);
}
else
{
throw new Exception("FTP 及路径不能为空!");
}
}
catch (Exception ex)
{
throw new Exception("删除订单时发生错误,错误信息为:" + ex.Message);
}
}
}
3:调用
try
{
FtpWeb ftp = new FtpWeb("10.53.132.52", "/srv/ftp/", "ftpa", "ftpa");
if (!ftp.DirectoryExist("tt"))
{
ftp.MakeDir("tt");
}
ftp.GotoDirectory("./tt/", false);
FileStream Stream = new FileStream(@"E:\Test\Test\Test\163074.xml", FileMode.Open, FileAccess.Read);
byte[] bt = new byte;
Stream.Read(bt, 0, (Int32)Stream.Length);
Stream.Close();
DataSet ds = new DataSet();
ds.ReadXml(@"E:\Test\Test\Test\163074.xml");
string aa = ds.GetXml();
byte[] bts = Encoding.UTF8.GetBytes(aa);
ftp.Upload("2.xml", bts);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
接下来我将对比两种方案的效率。
页:
[1]