我有一个服务器客户端程序,服务器在Raspberry Pi上运行(运行Linux),客户端是Android应用程序。我正在编写一个应用程序文件浏览器,它只是向服务器发送一个路径,然后服务器使用file.listFiles()
返回文件列表(服务器是用Java编写的)。
我将服务器/ Java程序作为sudo
运行,希望这可以访问系统中的所有文件,但令我惊讶的是,这个用户没有/home
目录下的读取权限。裨。
所以这是顺序发生的事情:
我请求通过套接字从Pi发送到Android应用的file.listFiles(new File("/"));
。在应用程序中,在发出下一个请求之前,我检查是否可以使用file.canRead();
和/home
目录读取文件,这将返回false。
Pi上的文件权限:
pi@raspberrypi ~ $ ls -l / | grep home
drwxr-xr-x 3 root root 4096 Dec 31 1969 home
我如何运行我的Java服务器:
pi@raspberrypi ~ $ sudo java -cp "/usr/local/lib/bluecovelib/bluecove/target/bluecove-2.1.1-SNAPSHOT.jar:/usr/local/lib/bluecovelib/bluecove-gpl-2.1.1-SNAPSHOT/target/bluecove-gpl-2.1.1-SNAPSHOT.jar:/home/pi/severinteractionutils.jar:." AppConnect
为什么sudo
用户无权访问Java程序中的/home
目录?
编辑:
我在Pi上运行了一个简单的程序来测试它是否是因为底层操作系统已经改变了。显然它确实有效果。
public class TestFileBrowser {
public static void main(String[] args) {
System.out.println("Hello, World");
File file = new File("/");
File [] files = file.listFiles();
for(int i=0; i<files.length; ++i) {
if(files[i].getAbsolutePath().equals("/home")) {
File homeDir = files[i];
if(homeDir.canRead()) {
System.out.println("Can Read");
if (homeDir.isDirectory()) {
System.out.println("Is directory");
}
}
}
}
}
}
这是控制台快照:
pi@raspberrypi ~ $ sudo javac TestFileBrowser.java
pi@raspberrypi ~ $ sudo java TestFileBrowser
Hello, World
Can Read
Is directory
答案 0 :(得分:2)
和/ home目录,返回false。
正确,因为您无法使用典型的文件流IO从目录中读取。您可以调用File.isDirectory()
(根据Javadoc)
测试此抽象路径名表示的文件是否为目录。
如果需要区分I / O异常与文件不是目录的情况,或同时需要同一文件的多个属性的情况,那么
Files.readAttributes
可以使用方法。
您可以查看使用属性阅读的权限。