java Apache MINA SFTP 示例
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38441969/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Apache MINA SFTP Example
提问by Hooli
I'm trying to set up an SFTP server with multiple users that each have their own home directory.
我正在尝试为多个用户设置一个 SFTP 服务器,每个用户都有自己的主目录。
I read this answerwhich 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?
有人可以告诉我如何解决这个问题吗?
回答by Hooli
I finally got it working. Here is a working example:
我终于让它工作了。这是一个工作示例:
pom.xml
pom.xml
<dependency>
<groupId>org.apache.sshd</groupId>
<artifactId>sshd-core</artifactId>
<version>0.14.0</version>
</dependency>
Test.java
测试.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);
}
}
}
回答by Skeeterdrums
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.
以上的更新版本(自 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();