发送一个cmdarray for exec进行处理 - 你好世界

时间:2016-04-05 14:19:56

标签: java linux runtime exec command-line-interface

我是不是正确地向exec()发送了一系列命令“hello world”?

正确的输出,你好世界:

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();
    }
}

碰撞:

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

0 个答案:

没有答案