Java调用shell脚本并获得结果

      /** 
* 运行shell脚本  * @param shell 需要运行的shell脚本 
     */  
    public static void execShell(String shell){  
        try {  
            Runtime rt = Runtime.getRuntime();  
            rt.exec(shell);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
  
/** 
     * 运行shell 
     *  
     * @param shStr 
     *            需要执行的shell 
     * @return 
     * @throws IOException 
     */  
    public static List runShell(String shStr) throws Exception {  
        List<String> strList = new ArrayList();  
  
        Process process;  
        process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr},null,null);  
        InputStreamReader ir = new InputStreamReader(process  
                .getInputStream());  
        LineNumberReader input = new LineNumberReader(ir);  
        String line;  
        process.waitFor();  
        while ((line = input.readLine()) != null){  
            strList.add(line);  
        }  
          
        return strList;  
    }  

  

<span style="font-family: Arial, Helvetica, sans-serif;">`</span>
</pre><pre name="code" class="java">
   /**
     * cmd 脚本执行方法
     * 该方法不执行任何逻辑.
     * 就是判断操作系统,返回执行结果是否成功.
     * 
     * @param invoke执行的shell脚本命令
     */
    public static String cmdControler2(String invoke) {
        System.out.println(invoke);
        if (invoke == null)
            return null;
        // 获取操作系统的名称 如:"Windows 7" or "Linux"
        String osName = System.getProperties().getProperty("os.name");
        String[] cmd_arr = new String[] { "/bin/sh", "-c", invoke };
        // // 根据操作系统生成shell脚本
        if (osName.contains("Windows"))
            cmd_arr = new String[] { "cmd", "/c", invoke };
        Process process = null;
        BufferedReader result = null, error = null;
        try {
            process = new ProcessBuilder(cmd_arr).start();
            // 功能是一样的
            // Process process = Runtime.getRuntime().exec(cmd_arr);
            String str = "";
            result = new BufferedReader(new InputStreamReader(
                    process.getInputStream()));
            error = new BufferedReader(new InputStreamReader(
                    process.getErrorStream()));
            while ((str = result.readLine()) != null) {
                // 成功提示
                // 此处的成功提示不需要显示
                // System.out.println(str);
                return str;
            }
            while ((str = error.readLine()) != null) {
                // 存在错误提示
                System.out.println(str);
                return ERRORSTR + str;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            // 关闭流
            if (result != null) {
                try {
                    result.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (error != null) {
                try {
                    error.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 释放process
            if (process != null)
                process.destroy();
        }
        // 前面的都没有执行就说明没有成功
        return "";
    }

  虽然使用Runtime.exec不是创建独立于平台的Java的最佳方式,但是有些时候是必要的。使用这种重定向技术有助于走出Runtime.exec的限制。 说明:
1.     exec的必须是可执行的程序,如果是命令行的命令则还需另外处理
2.     在windows中process = runtime.exec(new String[] { "cmd.exe","/C", "dir"});
3.     在linux中process = runtime.exec(new String[] { "/bin/sh","-c", "echo $PATH"});
            // 功能是一样的
            // Process process = Runtime.getRuntime().exec(cmd_arr);

              Process process = new ProcessBuilder(cmd_arr).start();


这两个是一样的效果。

上面的方法是我写的。直接改改就行。抽象成工具类就可以了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,你可以使用`ProcessBuilder`类来调用Shell脚本,并获取其执行结果。下面是一个示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ShellScriptExample { public static void main(String[] args) { try { // 创建ProcessBuilder对象,并指定要执行的Shell命令 ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", "your_shell_script.sh"); // 设置工作目录(可选) processBuilder.directory(new File("your_directory_path")); // 启动进程 Process process = processBuilder.start(); // 读取Shell脚本的输出结果 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } // 等待脚本执行完成 int exitCode = process.waitFor(); // 输出脚本的退出码 System.out.println("Exit Code: " + exitCode); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们使用`ProcessBuilder`来创建一个进程,并指定要执行的Shell命令。你需要将`your_shell_script.sh`替换为你要执行的实际Shell脚本的路径或命令。如果需要,你还可以通过`processBuilder.directory()`方法设置工作目录。 然后,我们通过`process.getInputStream()`来获取Shell脚本的输出结果,并使用`BufferedReader`来逐行读取输出内容。 最后,我们使用`process.waitFor()`方法等待脚本执行完成,并获取脚本的退出码。你可以根据需要对退出码进行处理。 请注意,这只是一个简单的示例,你可以根据实际需求进行修改和扩展。另外,确保你的Java程序具有执行Shell脚本的权限,并且指定的Shell脚本是可执行的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值