Как установить корневой каталог на сервере Apache Mina Sshd в Java

Я использую Apache Mina Sshd API для запуска локального SFTP-сервера в java. В 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");
        }
    }
}

person gihan-maduranga    schedule 01.04.2015    source источник
comment
возможный дубликат Как программно запустить sftp-сервер в java   -  person Daniel Newtown    schedule 09.04.2015
comment
@DanielNewtown Привет, приятель, я знаю, что это было давно .. не могли бы вы повторно опубликовать эту статью по ссылке? пока мы говорим, он возвращает 404. заранее спасибо   -  person James Jiang    schedule 02.06.2016


Ответы (3)


По умолчанию он берет корневой путь из системного свойства с именем user.dir.

Чтобы изменить это, вы можете переопределить getVirtualUserDir() в NativeFileSystemView и вернуть свой путь.

    sshd.setFileSystemFactory(new NativeFileSystemFactory() {
        @Override
        public FileSystemView createFileSystemView(final Session session) {
            return new NativeFileSystemView(session.getUsername(), false) {
                @Override
                public String getVirtualUserDir() {
                    return  "C:\\MyRoot";
                }
            };
        };
    });
person Tharaka Deshan    schedule 10.04.2015
comment
Привет, Тарака, сейчас я работаю над таким же вариантом использования, но я хочу создать полностью виртуальную файловую систему для пользователя, когда он входит в систему с помощью winscp или любого другого клиента sftp. Я пытаюсь создать или установить корневой каталог для пользователя, такой как /xyz, и подкаталоги, такие как /abc, вместо любого каталога системных файлов (например: C:\). Есть идеи, как этого добиться? - person SSharma2203; 22.01.2020

В более поздних версиях sshd вы можете использовать org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory и передать его экземпляру SshServer с помощью метода setFileSystemFactory.

Фрагмент:

VirtualFileSystemFactory fileSystemFactory = new VirtualFileSystemFactory();
fileSystemFactory.setDefaultHomeDir("home.directory");
sshd.setFileSystemFactory(fileSystemFactory)
person Stefan Winter    schedule 14.10.2018
comment
Теперь для этого требуется объект Path, например: fileSystemFactory.setDefaultHomeDir(Files.createTempDirectory(sshd_)) - person rees; 25.06.2020

Вы также можете перейти по следующей ссылке, чтобы узнать, как установить корневой каталог на SFTP-сервере Apache Mina sshd с другой версией sshd-core.

<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>

Как переопределить getVirtualUserDir() в Apache Mina sshd-core версии 0.14.0

person gihan-maduranga    schedule 22.04.2015
comment
Большое спасибо! Это единственное решение, доступное для версии 0.14.0 sshd-core. - person Brain; 16.09.2015