简体   繁体   English

与Java中的Linux Shell提示进行交互

[英]interacting with linux shell prompt in Java

Executor exec = new DefaultExecutor();
exec.setWorkingDirectory("/var/java/apache-tomcat-7.0.47/webapps/Telegram/tg")
CommandLine cl = new CommandLine("bin/telegram-cli -k tg-server.pub -W -U root");
int exitvalue = exec.execute(cl);

How can I get output of this command: 我如何获得此命令的输出:

exec.execute(cl);

and run other related commands on telegram-cli command prompt eg contact_list, msg contact "Hello world"; 并在telegram-cli命令提示符下运行其他相关命令,例如contact_list,msg contact“ Hello world”;

It looks to me as though it would be easier just to use ProcessBuilder instead. 在我看来,仅使用ProcessBuilder会更容易。

ProcessBuilder pb = new ProcessBuilder("bin/telegram-cli","-k","tg-server.pub","-W","-U","root");
pb.directory(new File("/var/java/apache-tomcat-7.0.47/webapps/Telegram/tg"));
Process p = pb.start();
try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(p.getOutputStream()),true)) {
    String line = null;
    pw.println("contact_list");
    while ((line = br.readLine()) != null) {
        System.out.println("line = " + line);
    }
}

Update It looks like the writes with PrintWriter need to be flushed. 更新似乎需要清除使用PrintWriter进行的写入。 You can do this by calling pw.flush() or adding the second argument true to the PrintWriter constructor. 您可以通过调用pw.flush()或向PrintWriter构造函数添加第二个参数true来实现。 I don't know the commands for telegram-cli, but you need to add one that will produce an output you can use to identify when to quit. 我不知道telegram-cli的命令,但是您需要添加一个将产生可用于标识何时退出的输出的命令。 Here's an example using /bin/sh. 这是使用/ bin / sh的示例。

ProcessBuilder pb = new ProcessBuilder("/bin/sh");
Process p = pb.start();
try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(p.getOutputStream()),true)) {
    String line = null;
    pw.println("ls");
    pw.println("pwd");
    pw.println("echo quit"); // this gives me output I can test for to break the loop
    pw.flush();
    while ((line = br.readLine()) != null && !line.contains("quit")) {
        System.out.println("line = " + line);
    }
}
int retcode = p.waitFor();
System.out.println("process ended with " + retcode);

Produces this output: 产生以下输出:

line = build
line = build.xml
line = dist
line = manifest.mf
line = nbproject
line = src
line = /home/shackle/NetBeansProjects/JavaApplication20
process ended with 0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM