【问题标题】:Call terminal and run command through Java App通过 Java App 调用终端并运行命令
【发布时间】:2012-12-25 05:30:39
【问题描述】:

我正在使用以下代码从我的 Java 应用程序运行命令:

String cmd[] = {"sh","-c", "sudo chmod 777 -R " + path};
Terminal.runCommand(cmd);

我想执行 .jar 只需单击它并选择“Open with..” -> “Java”;

问题是由于“sudo”命令,应用程序一直在等待密码,但没有调用终端,用户无法提供密码..

那么,我怎样才能调用上面的 coomand 和一个终端,让用户有机会输入密码并且应用程序最终继续运行?

非常感谢!

【问题讨论】:

  • 您是否希望 ls_exec 也可以使用 sudo 运行?使用 Process/ProcessBuilder,您可以读取输出并写入程序的输入。 Terminal 可以做什么?
  • @PeterLawrey 没想到,其实我觉得“le_exec”没有必要,不是吗?谢谢。
  • 我以前没见过,但它会保持一个窗口打开(假设有一个窗口),直到用户点击回车。我怀疑它在这里没有用。
  • @PeterLawrey 好的,谢谢。所以,没有必要,直到我们得到一个窗口,我正在寻找那个窗口。

标签: java linux shell process terminal


【解决方案1】:

这是一个 sudo 问题,而不是 Java 问题; sudo 以 root 身份执行操作。您的进程没有 root 权限,因此 sudo 需要对人类进行身份验证。这是一个特性,而不是一个错误。系统不应该允许您运行 root 命令。

一种选择可能是改用gksu,它在某些发行版中默认提供。它的工作原理类似,但会在 GUI 中而不是在(在这种情况下不存在的)终端上弹出密码对话框。

另一个可能是简单地以 root 身份运行您的 Java 进程,这可能会带来所有安全隐患。在某些情况下,这可能是一个有效的选择,但要小心。

或者您可以查看 sudo 和 sudoers 的手册页 - 可以将帐户配置为不需要密码,并在需要时将其限制为特定命令。

【讨论】:

  • 我认为两者兼而有之,因为我正在使用 Java 应用程序中的 sudo。我知道这是一个功能,我并不是说这是一个错误。我会按照您所说的尝试使用 gksu,如果它有效,我会告诉您。谢谢。
  • 从 C、Python、Ruby、Mono 或 Perl 应用程序调用它时会遇到完全相同的问题。这不是 Java 问题。
  • 它对我不起作用。我想我已经找到了一种方法,我会尝试使用“echo password | sudo -S chmod 777 -R path”。我将使用 Java(rsrs) 提示用户输入密码的字段,然后在上面的命令中传递“密码”的位置。我现在要回家了,明天我会发布结果。谢谢。
猜你喜欢
  • 2015-06-23
  • 2018-01-11
  • 1970-01-01
  • 2020-09-07
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2017-12-05
相关资源
最近更新 更多