如何确保使用正确的用户或权限创建文件?

时间:2015-08-24 13:47:50

标签: java bash file maven

商业模式有点复杂,如果解释不是100%清楚,请原谅我:

Uploader接口(String upload(String path, byte[] fileContents))定义了上传文件(包含在字节数组中)的不同方式,例如AmazonUploader,其中包含内容和path字符串,以及上传它在给定密钥下的Amazon S3。

我有一个名为LocalUploader的类,它在QA中使用,将给定的文件数组按原样写入本地磁盘。

Uploader用于两种不同的情况:

  1. 网页界面,由用户web
  2. 运行
  3. 通过用户ssh登录root的用户运行的命令行界面。
  4. 命令行界面与Web界面不同,但它们都捆绑了Uploader。此外,命令行可执行文件是最后运行java -jar ....的bash脚本。

    我们的想法是将文件保存到已知位置,然后通过简单的静态http服务器提供服务。

    问题简短:由于两个进程都写入同一个位置,当命令行界面写入文件时,Web界面不再可写(web无法访问由root制作的文件,显然,没有相反的问题。)

    现在,我坚持使用Java 6作为上传器,所以没有nio文件包。

    简而言之

    工作流程:

    Workflow

    这是我尝试过的:

    • 使用java.io.File的{​​{1}}。如果我在写入文件之前执行此操作,则会失败(返回.setWritable()),如果我之后执行此操作,则返回true但不设置false标志。
    • 使用writable以另一个用户身份运行jar。但这与参数插入混淆
    • 使用su,Java被及时忽略。可能是因为它是一个不同的过程。
    • 对linux权限使用group id标志 - 被Java迅速忽略。可能是因为它是一个不同的过程。

    我没有尝试:

    • 使用ACL - 我们不能搞砸底层分区。
    • 将文件作为输出返回并让bash写入文件 - 并非所有命令都需要写入文件,也可能需要也可能不需要写入多个文件。这不是我想要放在bash脚本中的逻辑,这是Uploader的工作。

    注意事项:

    • 我在Uploader上使用Java 6。没有花哨的东西。
    • 我使用Spring 3.2作为上传器。没有启动。
    • 可能在上传器中使用实用程序库。
    • 我正在使用Java 8 作为命令行可执行文件

    一些相关代码:

    Uploader.java

    umask

    init.sh

    @Override
    public String upload(String path, byte[] fileContents) {
        final File file = new File(path);
        try {
            FileUtils.writeByteArrayToFile(file, fileContents);
        } catch (IOException e) {
            throw new RuntimeException("Error writing file to path " + path, e);
        }
        return "";
    }
    

    整个事情闻起来像一些微不足道的问题,首先不应该存在,但我很难过。希望得到任何帮助。

0 个答案:

没有答案