2016-07-27 2 views
1

現在、私はProcessBuilderを使用してtest.outのようなファイルを実行しています。ここ は、私のコードの一部Java ProcessBuilderを使用してLinuxで./filenameを実行する方法

ArrayList cmd = new ArrayList(); 
cmd.add("sudo"); 
cmd.add("./test.out"); 
String s = ""; 
try{ 
ProcessBuilder pb = new ProcessBuilder(cmd); 
pb.directory(new File("/myPath")); 
pb.redircErrorStream(true); 
Process p = pb.start(); 
InputStream is = p.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferReader br = new BufferReader(isr); 
String line = ""; 
    while((line = br.readLine()) !=null) 
    { 
    s+=line; 
    } 
System.out.println(s); 
} 

I出力正しいパス( "/ MYPATH")です。 私はライン

`cmd.add("sudo")` 

を削除すると、出力は私の文字列与える:

oneoflib:must be root. Did you forgot sudo? 

しかし、私は

cmd.add( "sudoを")を追加し、一度に。

出力がありません。

何か問題がありますか?

正常に動作する端末からsudo ./test.outを実行できます。 私はEclipse BTWを使用しています。 ありがとうございます。

+0

:私のマシンで

public static void main(String[] args) throws IOException { Process process = new ProcessBuilder("bash", "-c", "echo <password> | sudo -S ./yourExecutable").start(); BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); String string; while((string = errorReader.readLine()) != null){ System.out.println(string); } BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); while((string = reader.readLine()) != null){ System.out.println(string); } } 

出力は次のようになりますか?あなたは最終的な声明の中に何かを印刷するつもりはありませんか?言い換えれば:System.out.println(s); – mdewit

+0

@mdewit sry、あなたは正しかった、私はコードを変更しました、ありがとうございます。私はちょうどターミナルの出力を取得したい。 – Kun

答えて

2

このプロセスからエラーストリームを取得すると、問題のデバッグに役立つはずです。

これは、以下のbashスクリプトを考慮して、それをyourExecutableと呼ぶことにします。のも、それはすべての適切な権限を持っていると仮定しましょう:

if [ "$EUID" -ne 0 ] 
    then echo "Please run as root" 
    exit 
fi 
echo "You are running as root" 

sudoなしで実行すると、それは"Please run as root"他の賢明な、それは"You are running as root"

コマンドを出力している場合は、リスト内のつまり最初の引数は、bashする必要があります印刷しますあなたが使っているシェルです。最初の引数は-cであるため、コマンドは次の文字列から読み取られます。文字列はecho <password> | sudo -S ./yourExecutableである必要があります。これは正確にsudoにパスワードを送信する最善の方法ではありませんが、私はそれがここでのポイントではないと思います。 sudoへの-Sは、stdoutに書き込まれ、sudoにパイプされたパスワードを要求します。あなたのコードで定義された変数sを持っていないのはなぜ

Password: 
You are running as root 
+0

返信いただきありがとうございます。エコー部分では、例えばパスワードが123456なので、 "echo <123456>"や "<>"のように書く必要があります。 <>が付いていない – Kun

+0

はあなたが望むものです。 – Imposter

+0

コードを実行すると、まだ空の出力が保持されます。 – Kun

関連する問題