【问题标题】:Running shell script on tomcat7在tomcat7上运行shell脚本
【发布时间】:2015-08-17 21:11:20
【问题描述】:

两天来,我一直在努力解决我的 tomcat7 服务器的文件权限问题。我有一个需要运行 shell 脚本的库类(myapp/WEB-INF 中包含的 .jar 文件)。该库由我编写,在 NetBeans 中运行良好,即。轻松创建、读取和删除文件。那是因为 NetBeans 将程序作为 blumonkey(我在我的 Ubuntu 系统上的用户名)运行。但是当我将它导入 tomcat 并运行它时,tomcat“执行”命令,不产生明确的输出,尝试检查文件(将在脚本成功时生成)并抛出 FileNotFoundException。

更多详情如下:

  • Tomcat7 使用 apt-get 安装,其数据位于 2 个位置 - /var/lib/tomcat7 包含 conf 和 webapps 文件夹,/usr/share/tomcat7 包含 bin 和 lib 文件夹
  • 用户上传一个 .zip 文件,该文件存储到 /home/blumonkey/data。程序的其余部分在此处存储的文档上运行。显然,tomcat 上传的所有新文件夹/文件的所有者都是 tomcat7。
  • 我尝试过将所有权更改为 blumonkey,将 tomcat7 添加到 blumonkey 用户组,但这些方法都不起作用(这里的某个地方我可能不小心搞砸了更改权限:/)。显然,tomcat7 无法处理它拥有的文件。(这怎么可能?)。
  • 当我在终端中运行该脚本时,它可以工作。但是当我做sudo -u tomcat7 script.sh 时它不起作用,即以tomcat7 运行它。它只是退出而没有任何消息。我怀疑这是正在发生的事情,因为我试图通过重定向 ProcessBuilder 中的错误和输出来进行调试,但它们是空的。

任何有关如何解决问题和运行脚本的帮助将不胜感激。如果您需要更多信息,请发表评论。

脚本执行代码

     private static void RunShellCommandFromJava(String command,String fn, String arg1,String arg2) throws Exception
   {
  try
    {
         System.out.println(System.getProperty("user.name")); 
         ProcessBuilder pbuilder = new ProcessBuilder("/bin/bash",command,fn,arg1,arg2);
         System.out.println(pbuilder.command());
            pbuilder.redirectErrorStream(true);
            Process p = pbuilder.start();
        p.waitFor();
    }
    catch(Exception ie)
    {
        throw ie;
    }
}

需要执行的命令

"/bin/bash /abs/path/to/script.sh  /abs/path/to/doc/in/data-folder maxpages=30 maxsearches=3"

PS:我关注了this 的问题,但没有帮助。我还尝试了其他选项,例如Runtime.exec()、bash、/bin/bash/ 和/bin/bash/ -c,其中一些根本不起作用,另一些则没有结果。

【问题讨论】:

  • tomcat 7是否有权限运行该文件?以及文件中的所有命令?如果它有一个需要 root 权限的命令,我可以看到问题
  • 脚本中没有这样的命令 - 基本的 wget 、 awk 等。tomcat 有权运行文件是什么意思?
  • 用户tomcat有执行权限吗?
  • 嗯,是的,tomcat 有一些怪癖,抱歉,我无法提供进一步的帮助

标签: java linux shell tomcat permissions


【解决方案1】:

尝试使用Runtime 并检查标准错误以找出问题所在(可能是权限或路径):

// run command
String[] fixCmd = new String[] { "/bin/bash", "/abs/path/to/script.sh", "/abs/path/to/doc/in/data-folder", "maxpages=30", "maxsearches=3" };
Process start = Runtime.getRuntime().exec(fixCmd);

// monitor standard error to find out what's wrong
BufferedReader r = new BufferedReader(new InputStreamReader(start.getErrorStream()));
String line = null;
while ((line = r.readLine()) != null) {
    System.out.println(line);
}

【讨论】:

  • 这与流程构建器中的redirectError(File f) 有何不同?
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多