由于项目需要加密上传文件,使用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> namedFactoryList = new ArrayList>();

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服务器上不存在中文问题,唯一缺点就是暂时不支持中文解码,后续在研究。

4356513857c9e67d3c9e30bbcf3819ca.png

Logo

更多推荐