2016-07-18 26 views
2

Ich versuche, einen SFTP-Server mit mehreren Benutzern einzurichten, die jeweils ihr eigenes Home-Verzeichnis haben.Apache MINA SFTP Beispiel

Ich las this answer, die erklärt, wie man ein virtuelles Verzeichnis für einen einzelnen Benutzer einstellt, aber ich bin nicht sicher, wie man mehrere Benutzer jedes mit ihrem eigenen Ausgangsverzeichnis hat.

Kann mir bitte jemand sagen, wie ich vorgehen soll?

Antwort

4

Ich habe es endlich funktioniert. Hier ist ein funktionierendes Beispiel:

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

Nur ein Vorbehalt mit diesem ist, dass es möglicherweise Probleme mit gleichzeitigen Benutzern haben kann. Ich bin mir nicht sicher, wie ich das lösen soll. – Hooli

+0

Es wäre großartig, wenn es eine aktuellere Version des Obigen gäbe. – Hooli

+0

Hallo, 'VirtualFileSystemFactory' hat eine 'setUserHomeDir'-Methode, mit der Sie ein Home-Verzeichnis nach Benutzer angeben können. Dann kann FileSystemFactory viele Benutzer verwalten. – irla

1

Aktualisierte Version von oben (Stand 1.4.0 von sshd-Core). Beachten Sie, dass ich keine Datei für den Hostschlüsselanbieter angegeben habe, da es sich um einen Junit-Integrationstest handelte.

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();