由于项目需要加密上传文件,使用Linux系统自带的SFTP服务很不方便。因此需要自己实现一套SFTP服务。这里使用的是Apache的开源软件MINA实现的SSHD协议。具体网址如下:http://mina.apache.org/sshd-project/embedding_ssh.html
需要引用一些Apache的开源架包,
服务器段具体实现如下
package com.song.SftpServer; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.sshd.SshServer; import org.apache.sshd.client.UserAuth; import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.keyprovider.FileKeyPairProvider; import org.apache.sshd.server.Command; import org.apache.sshd.server.PasswordAuthenticator; import org.apache.sshd.server.auth.UserAuthNone; import org.apache.sshd.server.command.ScpCommandFactory; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; import org.apache.sshd.server.sftp.SftpSubsystem; import org.apache.sshd.server.shell.ProcessShellFactory; public class SftpServer { public static void main(String[] args) { // 工厂方法,使用默认属性创建ssh服务对象 SshServer sshd = SshServer.setUpDefaultServer(); sshd.setPort(4444); String stest = "F:\\MyEclipse\\SFTPServer\\key.pem"; String []sKyepPath={stest}; // 保存会话安全校验信息,key.pem和key.ser为文件名 sshd.setKeyPairProvider(new FileKeyPairProvider(sKyepPath)); List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>(); namedFactoryList.add(new SftpSubsystem.Factory()); sshd.setSubsystemFactories(namedFactoryList); sshd.setCommandFactory(new ScpCommandFactory()); sshd.setShellFactory(new ProcessShellFactory()); sshd.setPasswordAuthenticator(new Authcator()); try { sshd.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
认证类
package com.song.SftpServer; import org.apache.sshd.server.PasswordAuthenticator; import org.apache.sshd.server.session.ServerSession; public class Authcator implements PasswordAuthenticator { @Override public boolean authenticate(String arg0, String arg1, ServerSession arg2) { // TODO Auto-generated method stub if(arg0.endsWith("song")&&arg1.endsWith("song")) { return true; } else { return false; } } }
实现如下,使用FileZile可以成功连接服务器。在Linux服务器上不存在中文问题,唯一缺点就是暂时不支持中文解码,后续在研究。