Javaがshellスクリプトを呼び出して、参照と権限問題を解決する方法。


1.java実行shell
javaは、Runtime.getRuntime().exec()の方法でshellのコマンドまたはスクリプトを実行し、exec()の方法のパラメータは、スクリプトの経路であっても良いし、直接のshellコマンドであっても良いです。
コードは以下の通りです。このコードには問題があります。完全コードは2を参照してください。

 /**
   *   shell
   * @param execCmd             
   * @param para     
   */
  private static void execShell(boolean execCmd, String... para) {
    StringBuffer paras = new StringBuffer();
    Arrays.stream(para).forEach(x -> paras.append(x).append(" "));
    try {
      String cmd = "", shpath = "";
      if (execCmd) {
        //     
        shpath = "echo";
      } else {
      //    
        shpath = "/Users/yangyibo/Desktop/callShell.sh";
      }
      cmd = shpath + " " + paras.toString();
      Process ps = Runtime.getRuntime().exec(cmd);
      ps.waitFor();
      BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
      StringBuffer sb = new StringBuffer();
      String line;
      while ((line = br.readLine()) != null) {
        sb.append(line).append("
"); } String result = sb.toString(); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } }
2.発生した問題と解決
  • は、転送されたパラメータ文字列にスペースが含まれている場合、上記の方法はパラメータを切断し、デフォルトではパラメータはスペースにのみなります。
  • 解決策:shellコマンドまたはスクリプトおよびパラメータを1つの配列に置いて、その後、配列をexec()方法に導入する。
  • 権限問題は、私たちがthis.get Class().getResource("/call Shell.sh").getPath()でスクリプト位置を取得したときに取ったshellスクリプトでは、shellスクリプトは実行権限がありません。
  • 解決:スクリプトを実行する前に、まずスクリプト実行権限を与えます。
  • 完全なコードは以下の通りです。
    
     /**
       *                         
       * @param scriptPath     
       * @param para     
       */
      private void execShell(String scriptPath, String ... para) {
        try {
          String[] cmd = new String[]{scriptPath};
          //           
          cmd=ArrayUtils.addAll(cmd,para);
          //          
          ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755",scriptPath);
          Process process = builder.start();
          process.waitFor();
          Process ps = Runtime.getRuntime().exec(cmd);
          ps.waitFor();
          BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
          StringBuffer sb = new StringBuffer();
          String line;
          while ((line = br.readLine()) != null) {
            sb.append(line).append("
    "); } // String result = sb.toString(); } catch (Exception e) { e.printStackTrace(); } }
    ソースの位置:
    https://github.com/527515025/JavaTest/tree/master/src/main/java/com/us/callShell
    参考://www.jb 51.net/articale/61529.httm
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。