How to Set Root Directory in Apache Mina Sshd Server in Java
Asked Answered
R

3

16

I use Apache Mina Sshd API to start up a local SFTP server in java.In SFTP client i use Jcraft jsch API to create my SFTP client.I successfully start up a server.The problem is that i want to write some unit test cases to check whether client can put some files into server's root directory. Currently my SFTP server doesn't have any root directory.So i would like to know that is there is any approach to set server's root directory.

Eg: C:\sftp How can i set this path as my server root directory.so then client can read and write files to it every time connect with the server.Thank you.

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");
        }
    }
}
Resident answered 1/4, 2015 at 11:10 Comment(2)
possible duplicate of How to start sftp server programmatically in javaHaler
@DanielNewtown Hi mate, I know this is a long while back.. could you please re-post that article in the link? it returns a 404 now as we speak. Thanks in advanceAscocarp
P
7

In Default it takes the root path from System property called user.dir

Inorder to change this, you can override getVirtualUserDir() in NativeFileSystemView and return your path.

    sshd.setFileSystemFactory(new NativeFileSystemFactory() {
        @Override
        public FileSystemView createFileSystemView(final Session session) {
            return new NativeFileSystemView(session.getUsername(), false) {
                @Override
                public String getVirtualUserDir() {
                    return  "C:\\MyRoot";
                }
            };
        };
    });
Purgative answered 10/4, 2015 at 6:49 Comment(1)
Hi Tharaka, I am working on the same type of use case now, but i want to create a totally virtual file system for the user when he logs in using winscp or any other sftp client. I am trying to create or set the root directory for the user such as "/xyz" and the sub directories such as "/abc" instead of any system file directory (eg: "C:\"). Any idea how to achieve that?Shrimp
T
11

In more recent sshd versions you can use org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory and supply it to the SshServer instance via method setFileSystemFactory.

Snippet:

VirtualFileSystemFactory fileSystemFactory = new VirtualFileSystemFactory();
fileSystemFactory.setDefaultHomeDir("home.directory");
sshd.setFileSystemFactory(fileSystemFactory)
Tarrance answered 14/10, 2018 at 14:21 Comment(1)
This now requires a Path object, e.g.: fileSystemFactory.setDefaultHomeDir(Files.createTempDirectory("sshd_"))Chancellorsville
P
7

In Default it takes the root path from System property called user.dir

Inorder to change this, you can override getVirtualUserDir() in NativeFileSystemView and return your path.

    sshd.setFileSystemFactory(new NativeFileSystemFactory() {
        @Override
        public FileSystemView createFileSystemView(final Session session) {
            return new NativeFileSystemView(session.getUsername(), false) {
                @Override
                public String getVirtualUserDir() {
                    return  "C:\\MyRoot";
                }
            };
        };
    });
Purgative answered 10/4, 2015 at 6:49 Comment(1)
Hi Tharaka, I am working on the same type of use case now, but i want to create a totally virtual file system for the user when he logs in using winscp or any other sftp client. I am trying to create or set the root directory for the user such as "/xyz" and the sub directories such as "/abc" instead of any system file directory (eg: "C:\"). Any idea how to achieve that?Shrimp
R
3

You can also follow following link to know about how to set root directory in Apache Mina sshd SFTP server with different sshd-core version.

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

into

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

How to override getVirtualUserDir() in Apache Mina sshd-core version 0.14.0

Resident answered 22/4, 2015 at 9:32 Comment(1)
Thank you very much! That's the only solution available for 0.14.0 version of sshd-core.Felipe

© 2022 - 2024 — McMap. All rights reserved.