如何将字符串发送到终端而不必将其作为标准命令?

我正在编写一个Java程序,需要使用终端命令才能工作。 我的function基本上是这样的:

public void sendLoginCommand() throws IOException { System.out.println("\n------------Sending Login Command------------\n"); String cmd="qskdjqhsdqsd"; Runtime rt = Runtime.getRuntime(); Process p=rt.exec(cmd); } public Process sendPassword(String password) throws IOException { System.out.println("\n------------Sending Password------------\n"); String cmd=password; Runtime rt = Runtime.getRuntime(); Process p=rt.exec(cmd); return p; } public void login(String password) throws IOException { sendLoginCommand(); Process p = sendPassword(password); System.out.println("\n------------Reading Terminal Output------------\n"); Reader in = new InputStreamReader(p.getInputStream()); in = new BufferedReader(in); char[] buffer = new char[20]; int len = in.read(buffer); String s = new String(buffer, 0, len); System.out.println(s); if(s.equals("Password invalid.")) loggedIn=false; else loggedIn=true; } 

这里,程序正确发送p4登录命令,但是,终端要求输入密码。 当我使用与sendLoginCommand()相同的行时,程序返回错误。 显然,我们只能通过Process发送标准命令。 我希望有人知道如何将正常的字符串发送到终端

先感谢您

您当前的问题是,您正在为要调用的每个“命令”启动单独的进程。 密码’command’被发送给一个完全没有意识到之前’login’命令的进程。

话虽如此,您更可怕的问题是对Process类的使用以及如何与Java内部的外部程序进行交互的严重误解。

这是一个可能有助于进一步深入了解该主题的教程 ,我建议谷歌搜索其他人。

我找到了问题的答案。

问题是终端的第二个响应实际上是在第一个响应中,密码必须在它的中间发送。 这是代码(我同意,我的解释有点模糊):

  String s=""; Process p = Runtime.getRuntime().exec("p4 login"); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); char a=(char)in.read(); while(a>0 && a<256) { a=(char)in.read(); if(nb==14) new PrintWriter(p.getOutputStream(),true).println(password); if(nb>16) s=s+a; nb++; } if(s.startsWith("User")) loggedIn=true; else loggedIn=false; 

为了与进程通信,您不会启动另一个进程,而是写入其stdin。 实际上有代码试图做这样的事情。 让sendLoginCommand返回创建的进程; 删除sendPassword所有代码,实际上删除了整个方法。 在主代码中,将密码写入进程的输出流。 所以我说的是

 new PrintWriter(sendLoginCommand().getOutputStream()).println(password); 

作为旁注,我强烈建议使用预先打包的库,该库已经封装了有关Java中进程通信的所有技术内容。

一个很好的图书馆是commons-exechttp://commons.apache.org/exec/

它带有命令行助手,后台线程来读取sysout / syserr输出,可选的看门狗在给定的时间后杀死进程,等等(当然几乎所有操作系统都可以工作)。