java - Tomcat 9不允许以777权限读取文件作为字符串?

标签 java file security tomcat tomcat9

我有一个 Tomcat 9 servlet 容器的 java Web 应用程序,它尝试在 Ubuntu 18.04 上读取具有 777 权限的/tmp 文件夹中的文件

ls -ltr /tmp/test.txt
-rwxrwxrwx 1 vagrant vagrant 10 Jan  3 17:03 /tmp/test.txt

java代码是:

    try {
        result = FileUtils.readFileToString(new File("/tmp/test.txt"));
    } catch (IOException ex) {
        log.info("##### Cannot read file. Reason: " + ex.getMessage());
    }

但总是显示错误

##### Cannot read file. Reason: File '/tmp/test.txt' does not exist

普通用户可以在终端窗口上正常打开此测试文件(示例用户:vagrant)。

vagrant@ras:~$ cat /tmp/test.txt

编辑:完全相同的根本问题可能会导致略有不同的症状,即 Tomcat 管理器应用程序无法用于部署位于/tmp 中的 war 文件。为了帮助将来的互联网搜索,以下是遇到此问题时您可能会在 catalina.out 中看到的典型错误。用户 tomcat 可以正确读取文件/tmp/my_app.war。尽管如此,你还是遇到了这个问题:

02-Apr-2021 22:25:20.254 SEVERE [http-nio-80-exec-4] org.apache.catalina.startup.ExpandWar.copy Error copying [/tmp/my_app.war] to [/var/lib/tomcat9/webapps/my_app.war]
    java.io.FileNotFoundException: /tmp/my_app.war (No such file or directory)
            at java.io.FileInputStream.open0(Native Method)
            at java.io.FileInputStream.open(FileInputStream.java:195)
            at java.io.FileInputStream.<init>(FileInputStream.java:138)
            at org.apache.catalina.startup.ExpandWar.copy(ExpandWar.java:276)
            at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:1016)

有人知道 Tomcat 9 的问题吗?我需要 Java Web 应用程序来读取此测试文件作为字符串。

最佳答案

我不得不直接在 tomcat 用户邮件列表中询问 http://tomcat.10.x6.nabble.com/Tomcat-9-does-not-allow-to-read-file-in-tmp-folder-with-777-permission-td5093298.html

我需要做的是更新/lib/systemd/system/tomcat9.service 并将 PrivateTmp=yes 设置为 PrivateTmp=no。然后,运行这两个命令:

sudo  systemctl daemon-reload
sudo  systemctl restart tomcat9

之后,它就可以正常工作了(我的java web应用程序可以在/tmp/中创建文件夹并从中读取文件)。

关于java - Tomcat 9不允许以777权限读取文件作为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59582796/

相关文章:

java - 如何在 Java 7 中用 nio 替换 File.listFiles(FileFilter filter)?

python - 我的谷歌应用引擎部署的源代码安全吗?

python - 为什么 Django 的用户模型将电子邮件字段设置为非唯一?

linux - 不受信任的 Docker 容器会造成什么损害?

java - 保存字段时更新时间

java - WebApplicationInitializer 简单示例

java - 从可迭代对象转换为页面对象

file - 在运行时加载资源文件

ios - 如何根据某些条件导入不同的头文件

c++ - 将文件读入数组并输出数组 C++