发送 cmdarray 供 exec 处理——hello world

2024-04-12

我不是发送一系列命令“hello world”到exec() https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec%28java.lang.String%5B%5D%29正确吗?

正确的输出,你好世界:

thufir@mordor:~$ 
thufir@mordor:~$ java -jar NetBeansProjects/HelloExec/dist/HelloExec.jar 
Apr 05, 2016 7:11:23 AM net.bounceme.mordor.telnet.Main run
INFO: starting..
Apr 05, 2016 7:11:23 AM net.bounceme.mordor.telnet.Telnet <init>
INFO: connecting..
Apr 05, 2016 7:11:23 AM net.bounceme.mordor.telnet.Telnet connect
INFO: connect..
Apr 05, 2016 7:11:23 AM net.bounceme.mordor.telnet.Telnet connect
INFO: [echo hello 1, echo hello 2, echo hello 3]
Apr 05, 2016 7:11:24 AM net.bounceme.mordor.telnet.Telnet connect
INFO: did process..
Apr 05, 2016 7:11:24 AM net.bounceme.mordor.telnet.Telnet connect
INFO: trying..
hello 1
Apr 05, 2016 7:11:24 AM net.bounceme.mordor.telnet.Telnet read
SEVERE: exiting.. 0
thufir@mordor:~$ 

代码:

package net.bounceme.mordor.telnet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import static java.lang.System.out;

public class Telnet {

    private final static Logger LOG = Logger.getLogger(Telnet.class.getName());

    public Telnet() {
        LOG.info("connecting..");
    }

    private List<String> getCommand() {
        List<String> commands = new ArrayList<>();
        commands.add("echo hello 1");
        commands.add("echo hello 2");
        commands.add("echo hello 3");
        return commands;
    }

    private void read(Process process) throws IOException, InterruptedException {
        BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = null;
        while ((line = input.readLine()) != null) {
            out.println(line);
        }
        int exitVal = process.waitFor();
        LOG.log(Level.SEVERE, "exiting.. {0}", exitVal);
    }

    private void connect() {
        LOG.info("connect..");
        Runtime runtime = Runtime.getRuntime();
        List<String> cmds = getCommand();
        String[] cmdArray = cmds.toArray(new String[cmds.size()]);
        String command = cmdArray[0];
        LOG.info(cmds.toString());
        Process process = null;
        try {
            process = runtime.exec(command);
        } catch (IOException ex) {
            LOG.severe("process wrong");
            Logger.getLogger(Telnet.class.getName()).log(Level.SEVERE, null, ex);
        }
        LOG.info("did process..");

        LOG.info("trying..");
        try {
            read(process);
        } catch (IOException | InterruptedException ex) {
            LOG.severe("read wrong");
            Logger.getLogger(Telnet.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void tryConnect() {
        connect();
    }
}

crash:

thufir@mordor:~$ 
thufir@mordor:~$ java -jar NetBeansProjects/HelloExec/dist/HelloExec.jar 
Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Main run
INFO: starting..
Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Telnet <init>
INFO: connecting..
Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Telnet connect
INFO: connect..
Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Telnet connect
INFO: [echo hello 1, echo hello 2, echo hello 3]
Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Telnet connect
SEVERE: process wrong
Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Telnet connect
SEVERE: null
java.io.IOException: Cannot run program "echo hello 1": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:485)
    at net.bounceme.mordor.telnet.Telnet.connect(Telnet.java:48)
    at net.bounceme.mordor.telnet.Telnet.tryConnect(Telnet.java:66)
    at net.bounceme.mordor.telnet.Main.run(Main.java:17)
    at net.bounceme.mordor.telnet.Main.main(Main.java:11)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 6 more

Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Telnet connect
INFO: did process..
Apr 05, 2016 7:12:32 AM net.bounceme.mordor.telnet.Telnet connect
INFO: trying..
Exception in thread "main" java.lang.NullPointerException
    at net.bounceme.mordor.telnet.Telnet.read(Telnet.java:30)
    at net.bounceme.mordor.telnet.Telnet.connect(Telnet.java:57)
    at net.bounceme.mordor.telnet.Telnet.tryConnect(Telnet.java:66)
    at net.bounceme.mordor.telnet.Main.run(Main.java:17)
    at net.bounceme.mordor.telnet.Main.main(Main.java:11)
thufir@mordor:~$ 

当尝试使用时cmdArray:

process = runtime.exec(cmdArray);

推理:

...这是因为当给 exec 一个字符串时,它首先解析它 (以我们不喜欢的方式)。相反,当给 exec 一个 字符串数组,它只是将其传递给操作系统,而无需 解析它。

https://stackoverflow.com/a/19383655/262852 https://stackoverflow.com/a/19383655/262852


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发送 cmdarray 供 exec 处理——hello world 的相关文章

随机推荐

  • 乘客错过了生产环境中的开发宝石

    我的生产服务器上有一个奇怪的行为 我通过 Capistrano 将 Rails 3 应用程序部署到生产服务器 Capistrano 脚本在部署结束时重新启动乘客 当我打开应用程序时 我看到一条乘客错误消息 Could not find au
  • 防止回车键触发按钮

    我有一个搜索输入框 当用户按下 Enter 时不需要执行任何操作 我正在使用 EmberJS 和 Jquery 以及以下代码 目前 它可以禁止触发弹出窗口 但由于某些原因 在 IE9 中 当按下 Enter 键时 切换按钮将成为焦点 在 C
  • 多个类的父类的部分特化

    我想对模板类使用部分专业化 以便该模板类的所有子级都将使用该专业化 让我用一个例子来解释一下 template lt typename T unsigned int rows unsigned int cols gt class BaseM
  • Heroku 应用程序上的远程 mysql 数据库

    我可以使用个人 Web 服务器上的 mysql 数据库而不是 heroku 的数据库吗 我这样配置我的生产数据库 production adapter mysql2 database somedatabase username someus
  • FastReport 5.3 Designer无法访问事件

    我在用着快速报告Delphi 10 1 Berlin 中的版本 5 3 14 我正在移植最初编写的 VCL 应用程序DelphiXE 当我打开报告时快速报表设计器单击对象检查器上的 事件 选项卡不会执行任何操作 我也无法单击报告的 代码 选
  • 解释日期:Console.Writeline 与 string.Format

    给出以下 C 代码 var dt DateTime Now Console WriteLine 0 MM dd yy 1 dt string Format 0 MM dd yy dt 当短日期 在 Windows 7 下 Control P
  • 多核::应用?

    有没有类似的东西sapply in the multicore图书馆 或者我必须unlist mclapply 为了达到这个目的 如果它不存在 原因是什么 提前致谢 如果这是一个愚蠢的问题 抱歉 在图书馆parallel 你有mcmappl
  • 来自全新 Yeoman 安装的 gruntserve 返回 - 警告:未找到任务“serve”

    运行后yo angular进而cd进入应用程序的根文件夹 与应用程序文件夹处于同一级别 gruntfile package json等 我尝试grunt serve我收到上述错误 Grunt 不会为我启动服务器 我到处寻找但找不到说要跑np
  • 如何在 Mathematica 中将包含小数点的字母数字(参考)数字转换为字符串

    我有以下类型 DAA76647 1 的参考号 我想将其原封不动地转换为 Mathematica 中的字符串 That is myfn DAA76647 1 给出作为输出 DAA76647 1 是否有捷径可寻 输入不能是字符串 除了转换为字符
  • 创建与智能感知配合使用的 JavaScript 函数

    我想利用 Visual Studio Intellisense 因此我已阅读 http msdn microsoft com en us library bb514138 aspx http msdn microsoft com en us
  • 如何在C++中重用字符串变量

    这是正确的吗 工作正常 string str in dat ifstream fin str c str ios binary ios ate Do I need to clear the string before assigning n
  • 我可以将 CSS 过渡应用于溢出属性吗?

    我正在尝试设置一个transition delay to the overflow的财产body when a div通过添加一个类来单击body如下 div click function body addClass no overflow
  • 如何在 NativeScript 中使用 swift 库?

    我正在尝试使用这个 ios 图表库 https github com danielgindi ios charts在 NativeScript 中 这个库是用 Swift 编写的 而不是用 Objective C 编写的 我可以使用它吗 我
  • 编译并运行 Java 应用程序的源代码

    我需要从我的 Java 应用程序编译并运行用 Python Pascal 或 C 编写的源代码 单个文件 我需要知道 如果编译过程成功 编译后的程序的返回输出 我怎样才能做到这一点 我一直在做同样的事情 public String comp
  • 从 ng carousal 顶部删除幻灯片编号文本

    我正在使用 ng bootstrap 的轮播
  • 何时在空结构上使用 impl [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我看到了以下代码 https github com paul schaaf solana escrow blob 4a2b92e6a6585f9
  • Safari Mobile iframe 存在内部 iframe 大小问题

    我有一个 简单 的 Web 应用程序 有一个导航和一个内容区域 在内容区域内 我有一个包含更复杂内容的 iframe 不幸的是 iframe 中的内容有另一个 iframe 在这里查看概述 在我的场景中 查看完整的 iframe 内容非常有
  • 带负载的 Jsoup HTTP POST

    我正在尝试通过 jsoup 发出此 HTTP 请求here http developer decarta com Docs REST BatchRequests http api decarta com v1 KEY batch reque
  • 如何在房间中制作复合钥匙

    我刚刚在房间里找到了 PrimaryKey 注释 那么如果我想制作复合键那么我该怎么做呢 利用primaryKeys Android 开发者文档 https developer android com reference android a
  • 发送 cmdarray 供 exec 处理——hello world

    我不是发送一系列命令 hello world 到exec https docs oracle com javase 7 docs api java lang Runtime html exec 28java lang String 5B 5