当前位置: 首页 > 知识库问答 >
问题:

java命令执行转义“|”

施同
2023-03-14

我有一个执行系统命令的功能:

public String cmd(String s) {
    String out = "";
    try {
        Runtime run = Runtime.getRuntime();
        Process pr = run.exec(s.split(" "));
        pr.waitFor();
        BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        String line = "";
        while ((line=buf.readLine())!=null) {
            out+=line+"\n";
        }
    } catch(Exception e) {
        e.printStackTrace();
    }
    return out;
}

该命令通过:

cmd("nmap -sL -n 192.168.1.0/24 | awk '/Nmap scan report/{print $NF}'");

预期产出:

192.168.1.0
192.168.1.1
 ...

实际产量:

Starting Nmap 7.80 ( https://nmap.org ) at 2021-04-12 20:27 EET
Nmap scan report for 192.168.1.0 ...

共有2个答案

柯河
2023-03-14

管道由外壳来解释。它执行一个命令,然后将一个命令的输出传递到下一个命令。您可以在Java中模拟这一点,启动两个命令,然后将第一个程序的OutputStream泵送到第二个程序的InputStream

或者,如果你不想这样做,你仍然可以称之为“sh-c’command1 | command2”

邹英光
2023-03-14

类似的问题很好地回答了这个问题:

  • 使用Java ProcessBuilder执行管道命令

要执行管道,必须调用一个shell,然后在该shell中运行命令。

Process p = new ProcessBuilder().command("bash", "-c", command).start();

bash调用shell来执行命令,-c表示从字符串中读取命令。因此,您不必在ProcessBuilder中以数组的形式发送命令。

String cmd(String command) {
  ProcessBuilder builder = new ProcessBuilder();
  builder.redirectErrorStream(true); // add stdErr to output

  Process process = builder.command("bash", "-c", command).start();
    
  StringBuilder processOutput = new StringBuilder(); // add lines easier
  // try-with to auto-close resources
  try (BufferedReader processOutputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));) {
    String readLine;
    while ((readLine = processOutputReader.readLine()) != null) {
      processOutput.append(readLine + System.lineSeparator()); // use system's line-break
    }

    process.waitFor();
  }

  return processOutput.toString().trim();
}

然后按预期打电话:

cmd("nmap -sL -n 192.168.1.0/24 | awk '/Nmap scan report/{print $NF}'");

注意:我增强了一点

  • 使用try with resources干净地处理资源

灵感来源:读取java exec的输出

 类似资料:
  • 问题内容: 我有一个bash脚本文件,正在shell中使用source命令调用它,并且正在设置许多环境变量。然后,我可以使用环境变量正在设置的所有工具。 现在,我想使用以下方法在Java中执行相同的操作: 我知道源是内部命令,不能从Java调用它。 还有其他方法可以通过java在该文件中设置环境变量,以便以后可以在我的代码中使用它们来调用其他命令吗? 先感谢您! 问题答案: 尝试执行类似的操作,在

  • 问题内容: 我正在尝试从用户读取一个文件,其中每一行都是一个命令,然后运行它(可以假定命令是合法的),但是当我给出类似的命令时,出现运行时异常错误: 线程“主”中的异常java.io.IOException:无法运行程序“ echo”:CreateProcess错误= 2,系统找不到指定的文件 我正在尝试运行以下命令: 在哪里。但这确实适用于类似的命令,所以看来我得到的运行时就像“运行”窗口而不是

  • 问题内容: 我正在尝试从GNU / Linux平台上的Java应用程序执行shell命令。问题是,尽管它可以从bash成功运行,但调用另一个Java应用程序的脚本永远不会结束。我试图调试它: 我尝试使用:ProcessBuilder(); 和Runtime.getRuntime()。exec(cmd); 看起来它正在等待完成。有任何想法吗? 谢谢,Laurențiu 问题答案: 您是否正在处理标准

  • 我正在使用以下代码执行一个SH文件Linux 此代码工作,但是我不能使用SH文件中的屏幕命令从Java执行时,我得到这个错误 必须连接到端子。 那么,可以将java“连接”到终端吗?当我通过SSH连接时,我想也能看到这个屏幕,所以我认为它必须连接到终端,当你通过SSH连接到服务器时,终端会显示出来。

  • 问题内容: 在下面的程序中,名称为“ don”,因此该命令将搜索活动目录,其所有名称均以don开头(例如donald等)。但是从读者对象分配后,line2变量变为空,并且永远不会进入循环。我究竟做错了什么?仅供参考:当我在命令行上输入命令时,该命令有效。 问题答案: 如果我没记错的话,管道(或重定向)需要使用cmd.exe启动程序。就像是:

  • 问题内容: 我正在尝试在Java中为Linux / unix os执行awk命令,但问题是当我执行命令时它没有显示任何错误它。但是执行后没有输出,执行它需要几分之一秒,我不知道问题请帮忙。 该代码是 谢谢您的帮助 问题答案: 使用Java正确启动命令行过程并不容易。我建议您使用commons- exec 而不是自己尝试。 现在,您在命令行中有两件事需要特殊处理: AWK脚本周围的单引号。当您将每个