应公司要求 需要搭建一台文件服务器(FTP服务器),要求 开源免费,需要支持断点续传,上传的文件大小至少需要500MB,用户量庞大,需要自动生成用户名和密码,每个用户只能管理自己的文件夹内容等苛刻的要求,以下说一下具体怎么搭建的。
1.选用服务器软件,以及客户端,可以说万里挑一,选定使用FileZilla Server 服务器+ FileZilla Client服务器,还有TYPSoft FTP这款服务器也可以考虑,为什么要用这个呢,因为要求需要自动生成用户名和密码,挑了很多服务器,都没法做到这一点,都需要手动去生成,这款服务器的用户信息是通过配置文件进行存储的,我们可以自己写个程序去生成用户名和密码。
2.开始配置服务器,去官网下载(https://filezilla-project.org/)安装包,安装后,打开服务器(也可以通过计算机管理中 的服务 上找到名字,右键启动,于是使用),打开FileZilla Server Interface.exe即可进入管理界面,配置用户名和密码后,发现提示Warning: FTP over TLS is not enabled, users cannot securely log in,百度解决了,主要原因是未启用tls模式,可以忽略掉,这里我也提一下解决方法,如图所示:
填好后就正常了,具体可以参考这里(http://www.linuxidc.com/Linux/2015-05/117620.htm)。
3. 接下来是最重要的了,可以看到安装目录里面有个FileZilla Server.xml文件,打开后一般的人也会读懂,里面是用户配置的文件,我们只要用程序去批量的生成这个文件放进来使用就可以达到公司的要求了,这里我用JAVA写了一个程序可以生成两个文件(1).用户名和密码,(2) xml的配置文件。xml中的密码经过破解发现是采用md5加密的。
主要程序如下所示:
package cn.nuohy.main; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Random; import cn.nuohy.entity.User; import cn.nuohy.entity.UserConfig; import cn.nuohy.util.Md5Util; public class DoUserConfig { int userNum = 100; ArrayList<User> users = new ArrayList<>(0); public static void main(String[] args) { DoUserConfig config = new DoUserConfig(); config.writeXMLData(); config.writeUserData(); config.createDir(); } public void writeXMLData(){ System.out.println("正在生成xml配置文件。。。"); String writeStr = this.createConfig(); File file = new File("C:\\Users\\Administrator\\Desktop\\FileZilla Server"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".xml"); try { FileOutputStream fos = new FileOutputStream(file); fos.write(writeStr.getBytes()); System.out.println("xml配置文件生成完毕!!!"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void writeUserData(){ System.out.println("正在生成用户信息。。。"); File file = new File("C:\\Users\\Administrator\\Desktop\\FTP用户信息统计-"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".txt"); try { FileOutputStream fos = new FileOutputStream(file); for (int i = 0; i < users.size(); i++) { if(i!=0){ fos.write("\r\n".getBytes()); //换行写入 } fos.write(("用户名:"+users.get(i).getName()+" 密码:"+users.get(i).getPassword()).getBytes()); } System.out.println("用户信息生成完毕!!!"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void createDir(){ System.out.println("正在创建文件夹。。。"); File file = null; for (int i = 0; i < users.size(); i++) { file = new File("D:\\soft\\FTPServer\\"+users.get(i).getName()); file.mkdir(); } System.out.println("文件夹创建完毕!!!"); } //并返回整个配置好的xml文件 public String createConfig(){ String reStr = ""; UserConfig userConfig = new UserConfig(); int alllen = (userNum+"").length(); for(int i=1;i<=userNum;i++){ User user = this.createUser(i, alllen); userConfig.setName(user.getName()); userConfig.setPassword(user.getMd5Password()); userConfig.setDir("D:\\\\soft\\\\FTPServer\\\\"+user.getName()); reStr += this.produceUserConfigPart(userConfig); users.add(user); //System.out.println("用户名:"+user.getName()+" 密码:"+user.getPassword()); } return this.joinConfig(reStr); } //产生姓名编号 Md5Util md5Util = new Md5Util(); public User createUser(int i,int alllen){ User user = new User(); //产生用户名 int cha = alllen-(i+"").length(); String zero = ""; if(cha!=0){ for(int j=0;j<cha;j++){ zero += "0"; } } //产生密码(用户名+随机的6位字母或者数字) user.setName(zero+i); String ps = zero+i+this.getStringRandom(6); user.setPassword(ps); user.setMd5Password(md5Util.getMd5(ps)); return user; } //生成随机数字和字母, public String getStringRandom(int length) { String val = ""; Random random = new Random(); //参数length,表示生成几位随机数 for(int i = 0; i < length; i++) { String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; //输出字母还是数字 if( "char".equalsIgnoreCase(charOrNum) ) { //输出是大写字母还是小写字母 int temp = random.nextInt(2) % 2 == 0 ? 65 : 97; val += (char)(random.nextInt(26) + temp); } else if( "num".equalsIgnoreCase(charOrNum) ) { val += String.valueOf(random.nextInt(10)); } } return val; } //返回拼接xml文件 public String joinConfig(String insertStr){ String returnStr = ""; File file = new File("C:\\Users\\Administrator\\Desktop\\ftp.xml"); try { FileInputStream fis = new FileInputStream(file); /*int ln; byte[] by = new byte[1024]; while((ln=fis.read(by))!=-1){ String outStr = new String(by,0,by.length,"gb2312"); if(outStr.contains("</Users></FileZillaServer>")){ outStr = outStr.replaceAll("</Users></FileZillaServer>", insertStr); } //System.out.println(outStr); //by = null; //by = new byte[1024]; returnStr = returnStr + outStr; }*/ byte[] by = new byte[fis.available()]; fis.read(by); String outStr = new String(by,0,by.length,"gb2312"); if(outStr.contains("</Users></FileZillaServer>")){ outStr = outStr.replaceAll("</Users></FileZillaServer>", insertStr); } returnStr = returnStr + outStr; returnStr += "</Users></FileZillaServer>"; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return returnStr; } //负责产生用户信息的部分 public String produceUserConfigPart(UserConfig userConfig){ String reStr = " <User Name=\""+userConfig.getName()+"\">\n" +" <Option Name=\"Pass\">"+userConfig.getPassword()+"</Option>\n" +" <Option Name=\"Group\" />\n" +" <Option Name=\"Bypass server userlimit\">0</Option>\n" +" <Option Name=\"User Limit\">"+userConfig.getMaxUserConnLimitNum()+"</Option>\n" +" <Option Name=\"IP Limit\">"+userConfig.getIpConnLimitNum()+"</Option>\n" +" <Option Name=\"Enabled\">1</Option>\n" +" <Option Name=\"Comments\" />\n" +" <Option Name=\"ForceSsl\">"+userConfig.getForceSsl()+"</Option>\n" +" <IpFilter>\n" +" <Disallowed />\n" +" <Allowed />\n" +" </IpFilter>\n" +" <Permissions>\n" +" <Permission Dir=\""+userConfig.getDir()+"\">\n" +" <Option Name=\"FileRead\">"+userConfig.getFileRead()+"</Option>\n" +" <Option Name=\"FileWrite\">"+userConfig.getFileWrite()+"</Option>\n" +" <Option Name=\"FileDelete\">"+userConfig.getFileDelete()+"</Option>\n" +" <Option Name=\"FileAppend\">"+userConfig.getFileAppend()+"</Option>\n" +" <Option Name=\"DirCreate\">"+userConfig.getDirCreate()+"</Option>\n" +" <Option Name=\"DirDelete\">"+userConfig.getDirDelete()+"</Option>\n" +" <Option Name=\"DirList\">"+userConfig.getDirList()+"</Option>\n" +" <Option Name=\"DirSubdirs\">"+userConfig.getDirSubdirs()+"</Option>\n" +" <Option Name=\"IsHome\">"+userConfig.getIsHome()+"</Option>\n" +" <Option Name=\"AutoCreate\">"+userConfig.getAutoCreate()+"</Option>\n" +" </Permission>\n" +" </Permissions>\n" +" <SpeedLimits DlType=\""+userConfig.getDlType()+"\" DlLimit=\""+userConfig.getDlLimit()+"\" ServerDlLimitBypass=\""+userConfig.getServerDlLimitBypass()+"\" UlType=\""+userConfig.getUlType()+"\" UlLimit=\""+userConfig.getUlLimit()+"\" ServerUlLimitBypass=\""+userConfig.getServerUlLimitBypass()+"\">\n" +" <Download />\n" +" <Upload />\n" +" </SpeedLimits>\n" +" </User>\n"; return reStr; } }
可以去我的主页下载完整程序,也可以给我至我邮件,[email protected]
需要注意应为生成的文件是参考自动生成的FileZilla Server.xml文件,我是将这个安装目录的FileZilla Server.xml文件拷贝到了桌面上,
这条语句 File file = new File("C:\\Users\\Administrator\\Desktop\\ftp.xml");
这里的ftp.xml是我通过对源文件修改得到的,因为要重新生成用户,所以要把<Users></Users>标签里面的值删除,包括这个标签。
运行后桌面会有两个文件
左边是记录的用户名和密码,右边是生成的配置文件。
将配置文件移动到安装目录下,并且改名为FileZilla Server.xml,把以前的删除。最后重启服务器(计算机管理->服务->FileZilla Server->右键->重新启动即可),然后通过FileZilla Server Interface.exe,管理软件可以看到用户处多了许多用户,是我们刚刚生成的:
最后通过FileZilla Client 使用我们记录的用户名和密码登陆即可
即可成功连接上!!!!
特地记录下来 ,以供参考。