【问题标题】:How do you set user work as root in Linux, when the bash script runs via Java code当 bash 脚本通过 Java 代码运行时,如何在 Linux 中将用户设置为 root
【发布时间】:2012-01-20 19:53:55
【问题描述】:

假设我的 bash 文件包含

chmod -R 777 $backup_files/app/webroot/uploadedFiles/

当我使用 /permission.sh 通过 root 权限运行它时它工作正常,但是当我尝试通过 java 代码运行这个 bash 脚本时

        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("/permission.sh");
        printBufferedReaderOutputFromProcess(process);
        process.waitFor();

它给了我以下错误:

chmod: changing permissions of `/home/app/webroot/uploadedFiles/A.jpg': Operation not permitted 

我能解决什么问题?

【问题讨论】:

标签: java linux bash permissions


【解决方案1】:

我怀疑您以前没有使用过 sudo,但是在脚本上使用 setuid 的替代方法是授予用户以 root 身份对脚本进行 sudo 的权限。即

sudo permisions.sh

以 root 身份运行无需询问密码即可运行。您必须在 sudoers.conf 中进行设置

【讨论】:

  • @PeterLawrey:你听说过 setuid 脚本吗?!?我的天啊!但是 sudo advisor 是可以的(但是 sudo 需要脚本的完整路径,如果它不在 PATH 中,例如 sudo ./permisions.sh)。
  • 我的第一个建议是使用 setuid 脚本,但是这些可能很难控制谁可以运行它并以任何集中方式进行管理。
【解决方案2】:

您是如何运行 Java 代码的?它是独立的,还是在像 Tomcat 这样的 Web 容器中运行?如果是后者,它可能以对您尝试更改的目录没有权限的用户身份运行。

【讨论】:

  • 是的,我正在通过tomcat6运行java代码,用户名是tomcat,我在sudoerstomcat ALL=(ALL) NOPASSWD: ALL中添加了以下行
  • 您是否在某个地方调用 sudo,可能是 permission.sh 的一部分? (它不只是自动工作。)
  • Pritom:您应该将您的 Jave 代码更改为 runtime.exec("sudo /permission.sh");。也许更严格是个好主意:tomcat ALL = NOPASSWD: /permission.sh.
  • 当我写 runtime.exec("sudo /permission.sh"); 然后它显示 sudo: sorry, you must have a tty to run sudo。当我在 sudoers tomcat ALL = NOPASSWD: /permission.sh 中写这个时,它会显示 chmod: changing permissions of /app/webroot/uploadedFiles/': Operation not permitted
  • 可以通过将!requiretty 添加到sudoers 文件中的指令来解决“抱歉,您必须有一个tty 才能运行sudo”问题。但是,类似于 stackoverflow.com/questions/8410360/… ,我真的质疑这里的整体方法。也许这是您需要在 Java 之外完成的初始设置。
猜你喜欢
  • 2011-06-08
  • 1970-01-01
  • 2012-06-10
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2016-07-11
  • 2014-11-20
相关资源
最近更新 更多