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

Mad*_*iha 7 java bash file maven

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

Uploader接口(String upload(String path, byte[] fileContents))定义了上传文件(包含在字节数组中)的不同方法,例如AmazonUploader获取内容和path字符串,并在给定密钥下将其上传到Amazon S3.

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

上传器用于两种不同的情况:

  1. Web界面,由用户运行 web
  2. 一个命令行接口,通过跑用户登录到ssh,经由用户root.

命令行界面与Web界面不同,但它们都捆绑了Uploader.此外,命令行可执行文件是java -jar ....最后运行的bash脚本.

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

问题很简单:由于两个进程都写入同一个位置,当一个文件由命令行界面写入时,它不再web可以被Web界面写入(无法访问所创建的文件root,显然,其他方式没有问题)周围).

现在,我坚持使用Java 6 for Uploader,所以没有nio文件包.

工作流程简而言之:

工作流程

这是我尝试过的:

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

我没试过的:

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

注意事项:

  • 我在Uploader上使用Java 6.没有花哨的东西.
  • 我使用Spring 3.2作为上传器.没有开机.
  • 我可以很可能使用的工具库中上传.
  • 我使用Java 8作为命令行可执行文件.

一些相关代码:

Uploader.java

@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 "";
}
Run Code Online (Sandbox Code Playgroud)

init.sh

#!/bin/bash

CONFIGDIR=${spring.config.location}
CONFIGFILE=$CONFIGDIR/${app.name}.conf
# Loading a settings from CONFIGFILE
[ -f $CONFIGFILE ] && source $CONFIGFILE

# Setting JAVA_BIN
if [ -z "$JAVACMD" ] ; then
  if [ -n "$JAVA_HOME"  ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
      # IBM's JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
    else
      JAVACMD="$JAVA_HOME/bin/java"
    fi
  else
    JAVACMD="`which java`"
  fi
fi

# Starting the application
$JAVACMD $JAVA_OPTS -jar ${app.home}/bin/${build.finalName}.jar  "$@" --spring.config.location=$CONFIGDIR/
Run Code Online (Sandbox Code Playgroud)

整个事情闻起来像一些琐碎的问题,首先不应该存在,但我很难过.非常感谢有关此事的任何帮助.

Lar*_*ner 1

您尝试过使用 sudo 吗?

sudo -u web $JAVACMD $JAVA_OPTS -jar ${app.home}/bin/${build.finalName}.jar  "$@" --spring.config.location=$CONFIGDIR/
Run Code Online (Sandbox Code Playgroud)

这应该可行,因为命令行界面是由以 root 身份登录的用户调用的(这是不推荐的,但我认为它是给定的)。