【发布时间】:2015-09-18 03:02:14
【问题描述】:
我有一个服务器客户端程序,服务器在 Raspberry Pi(运行 Linux)上运行,客户端是 Android 应用程序。我正在编写一个应用程序文件浏览器,它只是向服务器发送一个路径,然后服务器使用file.listFiles()(服务器是用Java编写的)返回文件列表。
我以sudo 运行服务器/Java 程序,希望这样可以访问整个系统的所有文件,但令我惊讶的是,这个用户没有对 Pi 的/home 目录的读取权限。
所以这是按顺序发生的:
我请求file.listFiles(new File("/"));,它通过套接字从 Pi 发送到 Android 应用程序。在应用程序中,在发出下一个请求之前,我检查是否可以使用 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
【问题讨论】: