Apache MINA SFTP Example

匿名 (未验证) 提交于 2019-12-03 01:25:01

问题:

I'm trying to set up an SFTP server with multiple users that each have their own home directory.

I read this answer which explained how to set a virtual directory for a single user but I'm not sure how to have multiple users each with their own home directory.

Can someone please tell me how to go about this?

回答1:

I finally got it working. Here is a working example:

pom.xml

 org.apache.sshdsshd-core0.14.0

Test.java

import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.sshd.SshServer; import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory; import org.apache.sshd.server.Command; import org.apache.sshd.server.PasswordAuthenticator; import org.apache.sshd.server.UserAuth; import org.apache.sshd.server.auth.UserAuthPassword; import org.apache.sshd.server.command.ScpCommandFactory; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; import org.apache.sshd.server.session.ServerSession; import org.apache.sshd.server.sftp.SftpSubsystem;  public class Test {      public static void main(String args[]) {         try {             Runtime.getRuntime().exec("sudo fuser -k " + "2222" + "/tcp");         } catch (IOException ex) {             Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);         }          File TEST = new File("test");         File ADMIN = new File("admin");         File ERROR = new File("error");          TEST.mkdirs();         ADMIN.mkdirs();         ERROR.mkdirs();          SshServer sshServer = SshServer.setUpDefaultServer();         sshServer.setFileSystemFactory(new VirtualFileSystemFactory(ERROR.getAbsolutePath()));         sshServer.setPort(2222);         sshServer.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("my.pem").getAbsolutePath()));         sshServer.setCommandFactory(new ScpCommandFactory());         List> userAuthFactories = new ArrayList();         userAuthFactories.add(new UserAuthPassword.Factory());         sshServer.setUserAuthFactories(userAuthFactories);         sshServer.setPasswordAuthenticator(new PasswordAuthenticator() {             @Override             public boolean authenticate(String username, String password, ServerSession session) {                 if ((username.equals("test")) && (password.equals("test"))) {                     sshServer.setFileSystemFactory(new VirtualFileSystemFactory(TEST.getAbsolutePath()));                     return true;                 }                 if ((username.equals("admin")) && (password.equals("admin"))) {                     sshServer.setFileSystemFactory(new VirtualFileSystemFactory(ADMIN.getAbsolutePath()));                     return true;                 }                 return false;             }         });         List> namedFactoryList = new ArrayList();         namedFactoryList.add(new SftpSubsystem.Factory());         sshServer.setSubsystemFactories(namedFactoryList);         try {             sshServer.start();         } catch (IOException ex) {             Logger.getLogger(CarrierSFTPServer.class.getName()).log(Level.SEVERE, null, ex);         }      } } 


回答2:

Updated version of above (as of 1.4.0 of sshd-core). Note that I did not specify a file for the host key provider since mine was for a Junit integration test.

List> userAuthFactories = new ArrayList>(); userAuthFactories.add(new UserAuthPasswordFactory());  List> sftpCommandFactory = new ArrayList>(); sftpCommandFactory.add(new SftpSubsystemFactory());  SshServer sshd = SshServer.setUpDefaultServer(); sshd.setPort(22); sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider()); sshd.setUserAuthFactories(userAuthFactories); sshd.setCommandFactory(new ScpCommandFactory()); sshd.setSubsystemFactories(sftpCommandFactory); sshd.setPasswordAuthenticator(new PasswordAuthenticator() {   @Override   public boolean authenticate(String username, String password, ServerSession session) {     if ((username.equals("admin")) && (password.equals("admin"))) {       sshd.setFileSystemFactory(new VirtualFileSystemFactory(new File("C:\\devl").toPath()));       return true;     }     return false;   } });  sshd.start(); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!