如何在Java中的Apache Mina Sshd服务器中设置根目录

15

我在Java中使用Apache Mina Sshd API启动本地SFTP服务器。在SFTP客户端中,我使用Jcraft jsch API创建我的SFTP客户端。成功启动了服务器。问题是我想编写一些单元测试用例来检查客户端是否可以将一些文件放入服务器的根目录中。目前我的SFTP服务器没有任何根目录。因此,我想知道是否有方法可以设置服务器的根目录。

例如:C:\sftp 如何将此路径设置为我的服务器根目录,以便每次连接服务器时客户端都可以读取和写入文件。谢谢。

public class SftpServerStarter {

    private SshServer sshd;
    private final static Logger logger = 
        LoggerFactory.getLogger(SftpServerStarter.class);

    public void start(){
        sshd = SshServer.setUpDefaultServer();
        sshd.setPort(22);
        sshd.setHost("localhost");
        sshd.setPasswordAuthenticator(new MyPasswordAuthenticator());
        sshd.setPublickeyAuthenticator(new MyPublickeyAuthenticator());
        sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider());
        sshd.setSubsystemFactories(
            Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
        sshd.setCommandFactory(new ScpCommandFactory());

        try {
            logger.info("Starting ...");
            sshd.start();
            logger.info("Started");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            logger.info("Can not Start Server");
        }
    }
}

可能是如何在Java中以编程方式启动SFTP服务器的重复问题。 - Daniel Newtown
@DanielNewtown 你好,老兄。我知道这是很久以前的事了...你能否重新发布一下链接中的文章呢?现在打开链接会返回404错误。先谢谢了。 - James Jiang
3个回答

11
在更新版本的sshd中,你可以使用org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory,并通过setFileSystemFactory方法将其提供给SshServer实例。
VirtualFileSystemFactory fileSystemFactory = new VirtualFileSystemFactory();
fileSystemFactory.setDefaultHomeDir("home.directory");
sshd.setFileSystemFactory(fileSystemFactory)

1
现在需要一个路径对象,例如:fileSystemFactory.setDefaultHomeDir(Files.createTempDirectory("sshd_")) - rees

7

默认情况下,它从名为 user.dir 的系统属性中获取根路径。

如果要更改此设置,可以在 NativeFileSystemView 中覆盖 getVirtualUserDir() 并返回您的路径。

    sshd.setFileSystemFactory(new NativeFileSystemFactory() {
        @Override
        public FileSystemView createFileSystemView(final Session session) {
            return new NativeFileSystemView(session.getUsername(), false) {
                @Override
                public String getVirtualUserDir() {
                    return  "C:\\MyRoot";
                }
            };
        };
    });

嗨,Tharaka, 我正在处理同样类型的用例,但我想为用户创建一个完全虚拟的文件系统,当他使用winscp或任何其他sftp客户端登录时。我正在尝试创建或设置用户的根目录,例如“/xyz”和子目录例如“/abc”,而不是任何系统文件目录(例如:“C:\”)。有什么想法如何实现? - SSharma2203

3

您可以通过以下链接了解如何在不同的sshd-core版本中设置Apache Mina sshd SFTP服务器的根目录。

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

介绍

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

如何在Apache Mina sshd-core版本0.14.0中覆盖getVirtualUserDir()方法


非常感谢!那是sshd-core 0.14.0版本唯一可用的解决方案。 - Brain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接