3

getOutputStream を使用してプロセスと対話するのに問題があります。これが私のコードです:

    Process p = null;
    ProcessBuilder pb = new ProcessBuilder("/home/eric/this.sh");
    pb.directory(new File("/home/eric/"));
    p = pb.start();

    InputStream in = null;
    OutputStream outS = null;

    StringBuffer commandResult = new StringBuffer();
    String line = null;
    int readInt;

    int returnVal = p.waitFor();

    in = p.getInputStream();

    while ((readInt = in.read()) != -1)
        commandResult.append((char)readInt);
    outS = (BufferedOutputStream) p.getOutputStream();
    outS.write("Y".getBytes());
    outS.close();

    System.out.println(commandResult.toString());
    in.close();

出力は次のとおりです。

Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
  libmono2.0-cil libmono-data-tds2.0-cil libmono-system-data2.0-cil
  libdbus-glib1.0-cil librsvg2-2.18-cil libvncserver0 libsqlite0
  libmono-messaging2.0-cil libmono-system-messaging2.0-cil
  libmono-system-data-linq2.0-cil libmono-sqlite2.0-cil
  libmono-system-web2.0-cil libwnck2.20-cil libgnome-keyring1.0-cil
  libdbus1.0-cil libmono-wcf3.0-cil libgdiplus libgnomedesktop2.20-cil
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  firefox-globalmenu
Suggested packages:
  firefox-gnome-support firefox-kde-support latex-xft-fonts
The following NEW packages will be installed:
  firefox firefox-globalmenu
0 upgraded, 2 newly installed, 0 to remove and 5 not upgraded.
Need to get 15.2 MB of archives.
After this operation, 30.6 MB of additional disk space will be used.
Do you want to continue [Y/n]? Abort

this.sh は単に「gksudo apt-get install firefox」を実行します

なぜそれが中止され、私の入力「Y」が受け入れられないのかわかりません。

4

1 に答える 1

1

いくつかの問題があります。

First :gksudo(1)開始するコマンドの標準入力と標準出力を使用して、いくつかの汚い非標準のトリックを実行します。恐ろしく失敗します。良い例は、次のコマンド ラインです。

$ echo foo | gksudo -g cat

がデータを配信するcatとすぐに、出力と終了が期待されます。echoいいえ。両方とも永遠gksudocatぶらぶらします。出力なし。

あなたのユースケースは

echo y |gksudo apt-get install ....

これも機能しません。これが解決されない限り、開始されたプログラムがユーザー入力を必要とする場合、リモート コントロールを実行するのを忘れることができます。

2番目:Rogerがすでに指摘したようwaitFor()に、コマンドの終了を待ちます。これは、ユーザーの入力がなく、gksudo の問題がなければ、すぐには発生しません。

3 番目少し押し込んだ後waitFor、次のブロッカーがあります。EOF まで ( EOF を含む) のプロセスの完全な出力を待ちます。これはすぐには起こりません (「最初」と「2 番目」を参照)。

第 4プロセスが既に 2 回停止した後 (「2 番目」と「3 番目」を参照) にのみ、何らかの入力が得られる場合がありYます\n


この一連の問題を解決する代わりに、より良い、より簡単な方法があるかもしれません:apt-get install標準入力で制御しようとしないでください。質問に自動的に「答える」適切なオプションをいくつか与えるだけです。man apt-getいくつかの候補を簡単に示します。

-y, --yes, --assume-yes
--force-yes
--trivial-only
--no-remove
--no-upgrade

詳しくはマニュアルをご覧ください。

私はこれがより良い、より安定した方法だと思います。

PS: 今、私はgksudoかなり pi*** o*** です。

于 2011-12-07T00:02:35.367 に答える