Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat 9不允许使用777权限以字符串形式读取文件?_Java_File_Security_Tomcat_Tomcat9 - Fatal编程技术网

Java Tomcat 9不允许使用777权限以字符串形式读取文件?

Java Tomcat 9不允许使用777权限以字符串形式读取文件?,java,file,security,tomcat,tomcat9,Java,File,Security,Tomcat,Tomcat9,我有一个由Tomcat9Servlet容器编写的JavaWeb应用程序,它试图在Ubuntu18.04上读取/tmp文件夹中具有777权限的文件 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&quo

我有一个由Tomcat9Servlet容器编写的JavaWeb应用程序,它试图在Ubuntu18.04上读取/tmp文件夹中具有777权限的文件

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)上很好地打开此测试文件

编辑:完全相同的根问题可能导致稍有不同的症状,即Tomcat Manager应用程序无法用于部署位于/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)
02-Apr-2021 22:25:20.254严重[http-nio-80-exec-4]org.apache.catalina.startup.ExpandWar.copy复制错误[/tmp/my_app.war]到[/var/lib/tomcat9/webapps/my_app.war]
java.io.FileNotFoundException:/tmp/my_app.war(没有这样的文件或目录)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于org.apache.catalina.startup.ExpandWar.copy(ExpandWar.java:276)
位于org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:1016)

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

我必须在tomcat用户邮件列表中直接询问,而不是在

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

sudo  systemctl daemon-reload
sudo  systemctl restart tomcat9

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

按照中描述的模式,我认为这可能是一种更好的取消/tmp私有化的方法:

sudo systemctl edit tomcat9

Add these two lines then save:
[Service]
PrivateTmp=no

sudo systemctl daemon-reload
sudo systemctl restart tomcat9
显然,这在功能上等同于Bằ吴荣奎的回答。但在我看来,覆盖文件正是针对这个用例的。看来这是一种非常干净的技术

作为参考,这里创建了覆盖文件(在我的Ubuntu 20.04系统上):

如果您决定稍后再次锁定,则可以轻松删除覆盖:

sudo systemctl revert tomcat9

我宁愿使
/etc/systemd/system/tomcat9.service.d/override.conf
文件内容如下:

[Service]
ReadWritePaths=/tmp
PrivateTmp=no
因为您可能会遇到这样的异常:

java.io.IOException: Read-only file system
at java.base/java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.base/java.io.File.createTempFile(File.java:2129)
at java.base/java.io.File.createTempFile(File.java:2175)
...

尝试在应用程序中创建临时文件时。

您确定Tomcat正在以
流浪者
用户身份运行吗?
ls-al/tmp
可能不会授予Tomcat读取权限。Tomcat对不读取可执行文件(x)的安全限制是可以想象的,但有点牵强。从用户名“vagrant”猜测,Tomcat可能正在虚拟机中运行,因此Tomcat的/tmp与shell的/tmp不同。您是否使用SELinux,AppArmor或任何其他此类安全工具?@LukeWoodward Ubuntu 18.04中没有SELinux。我想这一定是因为Tomcat9。细节,对于非emacs的人。。。我实际上用它来获得一个vim编辑器:
sudo editor=vim systemctl edit tomcat9
注意:我写了“面向非emacs用户”,但Ubuntu上的默认设置是
nano
,而不是emacs。
[Service]
ReadWritePaths=/tmp
PrivateTmp=no
java.io.IOException: Read-only file system
at java.base/java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.base/java.io.File.createTempFile(File.java:2129)
at java.base/java.io.File.createTempFile(File.java:2175)
...