在我的远程服务器上,我有一个只读的文件。
$ echo "Hello World" > /tmp/dummyfile && chmod a-w,a-x /tmp/dummyfile && ls -l /tmp/dummyfile
-r--r--r-- 1 dummyuser users 12 Mär 12 12:12 /tmp/dummyfile
我想使用Apache Mina SSHD通过Java NIO API访问我的远程服务器,如下所示:
SftpFileSystemProvider provider = new SftpFileSystemProvider(sshClient);
try (FileSystem fileSystem = provider.newFileSystem(uri, Collections.emptyMap())) {
Path path = fileSystem.getPath("/tmp/dummyfile");
byte[] bytes = Files.readAllBytes(path);
// ...
}
当我尝试读取一个只读文件(如上所述)时,我得到一个异常。
Exception in thread "main" SFTP error (SSH_FX_PERMISSION_DENIED): Permission denied
at org.apache.sshd.client.subsystem.sftp.impl.AbstractSftpClient.throwStatusException(AbstractSftpClient.java:210)
at org.apache.sshd.client.subsystem.sftp.impl.AbstractSftpClient.checkHandleResponse(AbstractSftpClient.java:245)
at org.apache.sshd.client.subsystem.sftp.impl.AbstractSftpClient.checkHandle(AbstractSftpClient.java:225)
at org.apache.sshd.client.subsystem.sftp.impl.AbstractSftpClient.open(AbstractSftpClient.java:665)
at org.apache.sshd.client.subsystem.sftp.SftpFileSystem$Wrapper.open(SftpFileSystem.java:284)
at org.apache.sshd.client.subsystem.sftp.SftpRemotePathChannel.<init>(SftpRemotePathChannel.java:77)
at org.apache.sshd.client.subsystem.sftp.SftpFileSystemChannel.<init>(SftpFileSystemChannel.java:35)
at org.apache.sshd.client.subsystem.sftp.SftpFileSystemChannel.<init>(SftpFileSystemChannel.java:31)
at org.apache.sshd.client.subsystem.sftp.SftpFileSystemProvider.newFileChannel(SftpFileSystemProvider.java:423)
at org.apache.sshd.client.subsystem.sftp.SftpFileSystemProvider.newByteChannel(SftpFileSystemProvider.java:413)
at org.apache.sshd.client.subsystem.sftp.SftpFileSystemProvider.newByteChannel(SftpFileSystemProvider.java:95)
at java.nio.file.Files.newByteChannel(Files.java:361)
at java.nio.file.Files.newByteChannel(Files.java:407)
at java.nio.file.Files.readAllBytes(Files.java:3152)
at test.Main.main(Main.java:36)
抛出异常是因为SftpFileSystemProvider.newFileChannel打开了具有读写权限的文件(请参阅SftpFileSystemProvider.java:420),但用户没有写入权限。
如何使用Java NIO和Apache Mina SSHD读取readonly文件的文件内容?