Apache MINA SFTP Example

前端 未结 2 1575
情话喂你
情话喂你 2020-12-18 08:20

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 f

相关标签:
2条回答
  • 2020-12-18 08:33

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

    pom.xml

     <dependency>
        <groupId>org.apache.sshd</groupId>
        <artifactId>sshd-core</artifactId>
        <version>0.14.0</version>
    </dependency>
    

    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<NamedFactory<UserAuth>> 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<NamedFactory<Command>> 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);
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-18 08:42

    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<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
    userAuthFactories.add(new UserAuthPasswordFactory());
    
    List<NamedFactory<Command>> sftpCommandFactory = new ArrayList<NamedFactory<Command>>();
    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();
    
    0 讨论(0)
提交回复
热议问题