2012-04-25 8 views
3

私は仕事のためにターミナルコマンドを使用する必要があるJavaでプログラムを書いています。 My機能は、基本的に次のようになります。ここでは文字列を標準コマンドにすることなく端末に送信するにはどうすればよいですか?

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を通して標準的なコマンドだけを送ることができます。 私は誰かが

があなたの当面の問題は、あなたが呼び出している「コマンド」のそれぞれに別々のプロセスを開始していることである事前

+1

実際には、ログインを使用してプロセスを起動しようとしていて、コマンドとしてパスワードを使用してプロセスを開始しようとしています –

+0

いいえ、ここでは、 "main"関数はlogin()です。まず、sendlogincommand()を呼び出します。 )は正常にコマンドを送信しますが、次のsendpassword()関数が呼び出されたときには、コマンドではないのでパスワードを送信できません。また、 "qsdqsdsdkqsdq"コマンドがコマンドではないと言うかもしれませんが、それは本当です。元のコマンドは "p4 login" – Mtrompe

+0

でした。そこには競合はありません。 –

答えて

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

にありがとう端末に通常の文字列を送信する方法を知っていたことを期待していました。パスワード 'command'は、以前の 'login'コマンドを全く知らないプロセスに対して発行されています。

あなたが言うより深刻な問題は、Processクラスが使用されていることとJava内から外部プログラムとやりとりする方法について深刻な誤解があることです。

ここで1つはtutorialなので、トピックに関する教育をさらに進めるのに役立ちます。私は他の人のためにグーグルアドバイスをします。

0

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

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

私はp.getOutputStream()とPrintWriterを使って何をすべきか分かりません。ちょっと詳細を教えてください。 – Mtrompe

+0

更新された回答をご覧ください。 –

+0

実際は申し訳ありませんが、動作しません。エラーは返されなかったが、新しいPrintWriter(sendLoginCommand()。getOutputStream())が原因であると思った。println(password);後でターミナルの出力を取得しようとすると、前のコマンドの出力である「パスワードを入力」が表示されるので、何もしません: "p4 login" – Mtrompe

0

、私は強く、すでにプロセス通信に関するすべての技術的なものをカプセル化するプリパッケージのライブラリを使用するようにアドバイスJavaで。

その程度の良いライブラリがコモンズ-execのhttp://commons.apache.org/exec/です。

これは、所定量の後にSYSOUT/SYSERR出力、プロセスを殺すために、オプションのウォッチドッグを読み取るために、コマンドラインヘルパー、バックグラウンドスレッドが付属しています(もちろんほぼすべてのOS上で動作します)

関連する問題