Java 正在发送用于exec处理的cmdarray--hello world

Java 正在发送用于exec处理的cmdarray--hello world,java,linux,runtime,exec,command-line-interface,Java,Linux,Runtime,Exec,Command Line Interface,我是否正确地发送了一系列命令“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.mor

我是否正确地发送了一系列命令“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:~$ 
理由是:

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


尝试将命令作为数组传递,即
String[]cmd={“echo”、“hello”、“1”}
等。您是指“echo hello world 1”、“echo hello world 2”等还是指“echo”、“hello”、“world”?我指的是第二个选项-“echo”、“hello”、“world”。实际上,“你好”和“世界”是论点,所以应该是“回声”,“你好世界”。这实际上是您在问题中链接的答案的格式。Linux调用也是这样工作的。
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:~$ 
process = runtime.exec(cmdArray);