由于项目需要加密上传文件,使用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服务器上不存在中文问题,唯一缺点就是暂时不支持中文解码,后续在研究。

JAVA 实现SFTP服务器功能_JAVA   SFTP服务器