如何发送一个字符串到终端,而无需它是一个标准的命令?(How to send a string to

2019-06-25 08:28发布

我用Java编写一个程序,需要使用终端命令来工作。 我的基本功能如下:

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(),则程序返回一个错误相同的路线。 显然,我们只能发送标准命令throught过程。 我希望有人知道如何正常的字符串发送到终端

先感谢您

Answer 1:

你眼前的问题是,你开始为每个“命令”要调用的独立的进程。 密码“命令”被颁发给一个过程,是完全不知道之前的“登录”命令。

话虽如此,你更可怕的问题是什么样的Process类的用途以及如何使用从Java内部外部程序交互的一个严重的误解。

这里有一个教程 ,可以帮助您进一步教育的话题,我会建议谷歌搜索等。



Answer 2:

我已经找到了答案,我的问题。

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

    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;


Answer 3:

为了与进程进行通信,你不启动另一个进程,但写它的标准输入。 其实那里面有代码,试图做这样的事情。 有sendLoginCommand返回创建的过程; 删除所有代码sendPassword ,其实整个删除方法。 在你的主代码写你的密码进程的输出流。 所以,我说的是

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


Answer 4:

作为一个侧面说明,我强烈建议,使用已经封装了有关Java中的进程间通信的所有技术资料预打包库。

关于一个好的图书馆是公共-EXEC( http://commons.apache.org/exec/ 。

它配备了命令行帮手,后台线程读取系统输出/输出SYSERR,可选的看门狗给定时间后杀死进程,等等(它的工作原理当然几乎所有的操作系​​统)。



文章来源: How to send a string to the terminal without having it to be a standard command?