Apache Mina SSHD SFTP服务器无法列出Android上的某些目录

时间:2014-11-20 04:34:35

标签: android ssh sftp apache-mina mina

使用Apache Mina SSHD我在我正在使用的Android应用程序中实现了SSH和SFTP服务器,我可以通过SSH登录,根目录,cd到'mnt / sdcard'和ls - 所有这一切都很好。我也可以得到su并做任何我想做的事。

然而,当我通过SFTP连接时,我无法列出大多数目录的内容(包括'/','/ mnt / sdcard')。但是,我可以列出'/ mnt / sdcard / Download'的内容 - 以及下载和上传该目录。

似乎某些文件正在停止其轨道中的目录列表 - 例如,在'/ mnt / sdcard'中似乎'TWRP'是导致问题的原因。这是我在WinSCP中得到的:

  

一般故障(服务器应提供错误说明)。

     

错误代码:4   来自服务器的错误消息:/ mnt / sdcard / TWRP

这是我从FileZilla获得的内容(更不用描述性):

  

命令:cd“/ mnt / sdcard”响应:新目录是:“/ mnt / sdcard”

     

命令:ls状态:列出目录/ mnt / sdcard

     

错误:正在读取目录。:失败状态:目录列表成功

尝试在WinSCP中列出'/'中的目录时:

  

一般故障(服务器应提供错误说明)。

     

错误代码:4   来自服务器的错误消息:/ charger

我已经实现了一个自定义FileSystemFactory,以便将传入的SFTP连接默认为'/ mnt / sdcard / Download',但我希望能够SFTP到任何目录(如果需要,我不介意使用su)

以下是设置Android SSH / SFTP服务器并设置自定义FileSystemFactory的相关代码:

//Initialize the server:
final Logger log = LoggerFactory.getLogger(server_service.class);
final SshServer sshd = SshServer.setUpDefaultServer();
final SimplePasswordAuthenticator passwordAuth = new SimplePasswordAuthenticator();
final SimplePublicKeyAuthenticator publicKeyAuth = new SimplePublicKeyAuthenticator();

passwordAuth.setUser(username_string);
passwordAuth.setPassword(password_string);
sshd.setPort(port);
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(server_info.getAppContext().getFilesDir().getPath() + "/key.ser"));
sshd.setShellFactory(new PseudoTerminalFactory("/system/bin/sh", "-i"));
sshd.setPasswordAuthenticator(passwordAuth);
sshd.setPublickeyAuthenticator(publicKeyAuth);
sshd.setSubsystemFactories(Arrays.<NamedFactory<Command>>asList(new SftpSubsystem.Factory()));
sshd.setFileSystemFactory(getModifiedNativeFileSystemFactory());

try {
    sshd.start();
    Log.i("SUCCESS: Server listening on port",Integer.toString(port));
    server_info.sshd = sshd;
    server_info.log = log;
} catch (Exception ex) {
    Log.e("FAILURE: Server start failed", ex.toString());
    ex.printStackTrace();
}


}

//Custom FileSystemFactory to change initial root directory on SFTP connection
NativeFileSystemFactory getModifiedNativeFileSystemFactory() {
    return new NativeFileSystemFactory() {

    @Override
    public FileSystemView createFileSystemView(Session session) {
        String userName = getUsername(session);
        NativeFileSystemView nfsv = new ModifiedNativeFileSystemView(
                userName, isCaseInsensitive());
        Log.d("Creating a modified NativeFileSystemView for user", nfsv.getUserName());
        return nfsv;
    }

};
}
//Hook for testing without valid session
String getUsername(Session session) {
    return session.getUsername();
}
//Class to return the altered FileSystemView with changed initial directory
class ModifiedNativeFileSystemView extends NativeFileSystemView {
    String modifiedRootDir;

public ModifiedNativeFileSystemView(String userName,boolean caseInsensitive) {
    super(userName, caseInsensitive);
    modifiedRootDir = System.getProperty("user.dir") + File.separator + TARGET_DIR_NAME;
    Log.d("Modified NativeFileSystemView created with root directory", modifiedRootDir);
}

@Override
public SshFile getFile(String file) {
    return getFile(modifiedRootDir, file);
}
}

编辑:使用“su restorecon -FR / data / media / 0”修复了SD卡访问。事实证明,升级到Lollipop后,TWRP文件夹的权限有限(即使是“su”) ls -l“它不会返回权限,只是说拒绝访问权限”。修复这些权限后,我可以使用SFTP列出sdcard目录 但是,我仍然无法使用SFTP列出根目录('/'),但在SSH中使用“su ls -l”时没有问题(没有su时它不起作用)。我不相信它是同一个问题 - 我认为这只是我的SFTP访问不是su。
谁能告诉我怎样才能让SFTP像su一样运行?

0 个答案:

没有答案