3

端末コマンドを使用して動作させる必要があるプログラムを 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 login コマンドを正しく送信しますが、端末はパスワードを要求します。sendLoginCommand() と同じ行を使用すると、プログラムはエラーを返します。どうやら、Process を介して送信できるのは標準コマンドのみです。誰かが通常の文字列を端末に送信する方法を知っていることを望んでいました

前もって感謝します

4

4 に答える 4

3

当面の問題は、呼び出している「コマンド」ごとに個別のプロセスを開始していることです。パスワード「command」は、以前の「login」コマンドをまったく認識していないプロセスに発行されています。

そうは言っても、あなたのより深刻な問題は、Process クラスの使用目的と、Java 内から外部プログラムと対話する方法についての重大な誤解です。

これは、トピックに関する教育をさらに進めるのに役立つチュートリアルの1つです。他の人にはグーグルをお勧めします。

于 2012-04-25T12:59:02.973 に答える
1

私は自分の質問に対する答えを見つけました。

問題は、端末の 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;
于 2012-04-30T11:07:19.463 に答える
0

プロセスと通信するには、別のプロセスを開始するのではなく、その標準入力に書き込みます。実際には、そのようなことをしようとするコードがそこにあります。作成したプロセスをsendLoginCommand戻してもらいます。のすべてのコードを削除しますsendPassword。実際には、メソッド全体を削除します。メイン コードで、パスワードをプロセスの出力ストリームに書き込みます。だから私が言っているのは

new PrintWriter(sendLoginCommand().getOutputStream()).println(password);
于 2012-04-25T13:02:12.497 に答える
0

余談ですが、Java でのプロセス通信に関するすべての技術的な内容がすでにカプセル化されている、事前にパッケージ化されたライブラリを使用することを強くお勧めします。

それに関する優れたライブラリはcommons-exec ( http://commons.apache.org/exec/ .

コマンド ライン ヘルパー、sysout/syserr 出力を読み取るためのバックグラウンド スレッド、一定時間後にプロセスを強制終了するためのオプションのウォッチドッグなどがあります (もちろん、ほぼすべての OS で動作します)。

于 2012-05-01T00:18:47.963 に答える