在Java中与linuxshell提示符交互

在Java中与linuxshell提示符交互,java,linux,Java,Linux,如何获取此命令的输出: 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); 并在t

如何获取此命令的输出:

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

并在telegram cli命令提示符上运行其他相关命令,如contact_list、msg contact“Hello world”

在我看来,仅仅使用ProcessBuilder似乎更容易

exec.execute(cl);
更新 似乎需要刷新PrintWriter的写入。您可以通过调用
pw.flush()
或将第二个参数
true
添加到PrintWriter构造函数来完成此操作。我不知道telegram cli的命令,但您需要添加一个命令,该命令将生成一个输出,您可以使用该输出确定何时退出。下面是一个使用/bin/sh的示例

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);
    }
}
生成此输出:

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

您使用哪个库来执行此操作?它看起来不像内置的类。我没有使用任何库,但这个软件安装在我们的专用服务器上。我试图使用简单的java技术来运行程序及其相关命令您正在使用一个库,这是一个重要的认识,因为一旦您知道您正在使用哪个库,您就可以阅读它的文档,了解如何使用它。事实上,你没有安装它自己并不意味着它不是一个库…好吧,它的库。关于在javaline=Telegram cli中打印输出,您建议使用libpython版本2.6.6 line=I:config dir=[/root/.Telegram cli]line=>line=>line=>line=>line=>line=>line=>line=>line=>line=>line=>它的开始,我由衷地感谢。当bin/telegram命令。。。启动例如联系人列表或消息用户msgtext??上述代码不执行pw.println(“联系人列表”);感谢您的好评,但不幸的是,它没有启动电报API使用的命令。Java中有没有办法在linux中启动一个程序,然后调用它的命令?上面的例子是启动linux程序/bin/sh并调用它的命令ls和pwd。这个例子对你有用吗?确保使用刷新输出流的示例的最新版本。ls应该返回当前目录中的文件列表,pwd打印当前目录。
line = build
line = build.xml
line = dist
line = manifest.mf
line = nbproject
line = src
line = /home/shackle/NetBeansProjects/JavaApplication20
process ended with 0