【问题标题】:Runtime.getRuntime().exec() doesn't execute some commandsRuntime.getRuntime().exec() 不执行某些命令
【发布时间】:2015-05-18 13:55:16
【问题描述】:

我是 java 初学者,遇到了一些问题。我已经阅读了几个关于这个主题的主题,但没有一个对我有用。这是我的代码:

try 
{

        Console console = System.console();

        String command;

        while(true)
        {
            command = console.readLine("Enter input:");
            Process proc = Runtime.getRuntime().exec(command);

            // Read the output

            BufferedReader reader =  
                  new BufferedReader(new InputStreamReader(proc.getInputStream()));

            String line = "";
            while((line = reader.readLine()) != null) {
                System.out.print(line + "\n");
            }

            proc.waitFor(); 
        }



}
    catch(Exception e) {} 

所以我正在尝试制作一个 java 程序并在其中运行终端命令(我使用的是 linux)。该程序适用于“ls”“ps ef”等命令,但当我键入“cd”时它不起作用。我知道 cd 会产生不同的进程,应该这样使用:“Runtime.exec(String command, String[] envp, File dir)”。我的问题是:
如何让我的程序运行各种终端命令?对不起,如果问题听起来很傻。谢谢。

【问题讨论】:

  • 一个问题是:“cd”不是命令;这是你的shell的一个功能!当像你一样从 Java 运行命令时;没有壳!因此它不起作用!还有一件事:你的项目可能真的只是学习 Java 概念;但总的来说:允许用户提供任何类型的命令,然后只执行它们......是一个非常糟糕的主意。
  • 您可能还想查看此线程。 stackoverflow.com/questions/31776546/…

标签: java linux terminal


【解决方案1】:

cd 命令是一个 shell 内置命令。通过exec(...) 运行命令时没有shell。实际上,如果您尝试在系统的任何 bin 目录中找到 cd 命令,您将找不到...因为它不可能作为常规命令来实现。

如果您尝试使用cd 更改 JVM 本身的当前目录,那将不起作用,因为命令只能更改自身的当前目录以及(之后)它启动的命令。它不能改变它的父进程当前目录。

如果您尝试使用cd 更改当前目录以执行后续命令,那也不起作用。您设置当前目录的上下文在命令完成时结束。

事实上,为使用exec 运行的命令更改目录的正确方法是通过ProcessBuilder API 本身进行设置。


如何让我的程序运行各种终端命令?

你不能。一些“终端命令”只对 shell 命令有意义,这意味着你需要一个 shell。

我想,您可以考虑在 Java 代码中模拟所需的行为。这适用于cd ...但其他命令可能更难处理。

(不管怎样,用 Java 实现一个 POSIX 兼容的 shell 是可能的。这只是很多工作。)

【讨论】:

  • 那么有没有办法在java中创建像ssh这样的程序呢?哪个执行每个终端命令?
  • 您是否尝试过使用ssh 运行cd?它有什么用处吗?
  • 你试过exec("sh -c cd")吗?它有什么用处吗?
  • 正如我在回答中所说,可以在 Java 中实现 POSIX shell。
  • 用C语言做这样的程序会不会更容易?
【解决方案2】:

您实际上必须运行您想要使用的控制台(即 sh、csh、bash 等),然后使用进程 OutputStream 来输入命令

【讨论】:

  • 不是控制台控制台 = System.console();这个命令默认制作 bash?
  • 不,它不是这样做的。所有这些都是对运行 Java 的控制台(如果有的话)的引用。按照我的建议,您需要打开另一个控制台
【解决方案3】:

我认为问题不是你的代码,命令才是问题......

如果你的命令是 cd ,你想看什么?

在后台它会改变路径,但你什么也得不到。

更改目录不会处理任何输出。

【讨论】:

  • 实际上它正在退出程序。使用 cd 命令它应该打开目录但什么都不显示。
  • 将系统添加到您的 try catch 并查找错误日志
【解决方案4】:

这对我有用:

Runtime.getRuntime().exec(new String[]{ "/system/bin/sh", "-c", "ls -l" } );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多