【问题标题】:Apache MINA SFTP ExampleApache MINA SFTP 示例
【发布时间】:2016-07-18 16:41:12
【问题描述】:

我正在尝试设置一个包含多个用户的 SFTP 服务器,每个用户都有自己的主目录。

我阅读了this answer,其中解释了如何为单个用户设置虚拟目录,但我不确定如何让多个用户各自拥有自己的主目录。

谁能告诉我怎么做?

【问题讨论】:

    标签: java sftp sshd apache-mina


    【解决方案1】:

    我终于让它工作了。这是一个工作示例:

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

    【讨论】:

    • 唯一需要注意的是,它可能会对并发用户产生问题。我不确定如何解决这个问题。
    • 如果上面有更新的版本就好了。
    • 嗨,VirtualFileSystemFactory 有一个 setUserHomeDir 方法,您可以在其中按用户指定主目录。然后 FileSystemFactory 将能够处理许多用户。
    【解决方案2】:

    上面的更新版本(从 sshd-core 的 1.4.0 开始)。请注意,我没有为主机密钥提供程序指定文件,因为我的是用于 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();
    

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 1970-01-01
      • 2019-08-03
      • 2015-01-07
      • 1970-01-01
      • 2015-01-07
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多