3

次のような Java コードを使用して、Linux で 2 つのコマンドを実行する必要があります。

 Runtime rt = Runtime.getRuntime();
          
           
            Process  pr=rt.exec("su - test");
            String line=null;
            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
          
            while((line=input.readLine()) != null) {
                
                System.out.println(line);
            }
           pr = rt.exec("whoami");
             input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

             line=null;

            while((line=input.readLine()) != null) {
                 System.out.println(line);
            }               
            int exitVal = pr.waitFor();
            System.out.println("Exited with error code "+exitVal);              
        } catch(Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }

問題は、2 番目のコマンド ("whoami") の出力に、最初のコマンド ("su - test") で使用された現在のユーザーが表示されないことです。このコードに問題はありますか?

4

3 に答える 3

6

通常、シェルでコマンドを実行する必要があります。このようなもの:

    Process  pr = rt.exec(new String[]{"/bin/sh", "-c", "cd /tmp ; ls"});

suしかし、この場合、それ自体がインタラクティブなサブシェルを作成しているため、うまくいきません。ただし、これを行うことができます:

    Process  pr = rt.exec(new String[]{"su", "-c", "whoami", "-", "test"});

また

    Process  pr = rt.exec(new String[]{"su", "test", "-c", "whoami"});

もう 1 つの方法は、sudo代わりにsu;を使用することです。例えば

    Process  pr = rt.exec(new String[]{"sudo", "-u", "test", "whoami"});

exec注: 上記のいずれも実際にこれを必要とするわけではありませんが、「解析」を行うよりも、文字列の配列として「コマンド ライン」を組み立てることをお勧めします。(問題は、execs スプリッターがシェルの引用を理解しないことです。)

于 2013-07-23T14:19:54.553 に答える
2

Runtime.exec() のJavadocに記載されているように:

指定された文字列コマンドを別のプロセスで実行します。

exec() を介してコマンドを実行するたびに、別のサブプロセスで実行されます。これは、 su の効果が戻った直後に存在しなくなることも意味しwhoamiます。そのため、最初にプログラムを起動したユーザーを使用して、別のサブプロセスでコマンドが実行されます。

su test -c whoami

あなたが望む結果が得られます。

于 2013-07-23T14:19:37.467 に答える