我的应用程序有多个用户和一个超级用户。我试图通过Java代码在Linux中编写和存储一个文件,但我得到了权限被拒绝的错误。我使用了以下代码:
Process process = Runtime.getRuntime().exec("/usr/bin/tiff2pdf -o /tmp/tiff_dir/temp.pdf /tmp/tiff_dir/image.tiff");
int returnCode = process.waitFor();我得到以下错误:
java.io.FileNotFoundException: image.tiff (Permission denied)根据我的分析,似乎是因为用户没有root权限,所以我得到了这个错误。这个问题的解决方案是什么?
发布于 2014-02-13 17:31:02
你不应该以超级用户的身份运行这样的命令,因为这会带来安全风险(例如,如果有人控制了你的java程序,那么他们就拥有通向王国的钥匙)。相反,您应该以较低的权限运行。
看起来问题出在访问image.tiff上,而不是tiff2pdf上。检查image.tiff的所有者和权限。
发布于 2014-02-13 18:00:14
首先,这两行不会产生java.io.FileNotFoundException: image.tiff (Permission denied)
Process process = Runtime.getRuntime().exec("/usr/bin/tiff2pdf -o temp.pdf image.tiff");
int returnCode = process.waitFor();如果由于某种原因,命令失败,它将返回一个非零的返回码,并根据进程的标准错误生成一些输出(这是惯例)。您可以从process.getErrorStream()获得该标准错误(为了以防万一,可能也值得查看一下标准输出)。如果在那里找不到文件有问题,它不会抛出这样的FileNotFoundException,因为Java不能理解您的命令的预期输出。
编辑,在您的评论之后:
它是从这一点抛出的,returnCode的值是1。而且,当我手动更改根用户的文件权限时,一切都正常工作。
这是不可能的。如果您的应用程序在这两行中的任何一行抛出异常,它将退出正常的控制流:您将根本无法读取returnCode。
其次,您应该使用String[]中的每个参数来运行exec命令,而不是将所有参数都放在一行中,这应该可以防止出现引用问题,例如,如果文件名包含空格。
我还建议在命令中使用绝对路径,以确保您在预期的目录中工作。(*编辑:*现在您正在使用绝对路径,请确保您的用户在/tmp/tiff_dir上具有rwx权限。)
为了更直接地回答您的问题,您当然可以使用Runtime.exec(new String[] {"/usr/bin/sudo", ... the rest of your command ... }运行sudo,但出于安全原因,这不是一个好主意。您还需要更改sudoers文件以允许它不需要密码,或者找到一种方法来传递密码,无论是on the command line (肯定是一个安全风险!)或者以某种方式手动将其传递给输入流。)
发布于 2014-02-13 17:29:33
试试这个:
File file = new File("/opt/image.tiff");
Runtime runtime = Runtime.getRuntime();
runtime.exec(new String[] { "/bin/chmod", "777",file.getPath()});这将对该文件执行完全权限。
https://stackoverflow.com/questions/21749862
复制相似问题