2016-07-18 5 views
2

Я пытаюсь настроить SFTP-сервер с несколькими пользователями, каждый из которых имеет свой собственный домашний каталог.Apache MINA SFTP Пример

Я прочитал this answer, в котором объясняется, как установить виртуальный каталог для одного пользователя, но я не уверен, как иметь нескольких пользователей каждый со своим домашним каталогом.

Может кто-нибудь рассказать мне, как это сделать?

ответ

4

Я, наконец, получил его работу. Вот рабочий пример:

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

Предостережение только в том, что это может иметь проблемы с одновременными пользователями. Я не уверен, как это разрешить. – Hooli

+0

Было бы здорово, если бы была более современная версия выше. – Hooli

+0

Привет, 'VirtualFileSystemFactory' имеет метод' setUserHomeDir', где вы можете указать домашний каталог пользователем. Затем FileSystemFactory сможет обрабатывать множество пользователей. – irla

1

Обновленная версия выше (по состоянию на 1.4.0 из SSHd-ядра). Обратите внимание, что я не указал файл для поставщика хост-ключа, так как мой был для теста интеграции Junit.

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(); 
Смежные вопросы