`
jaymsimusic
  • 浏览: 94359 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

在java程序中跨平台运行shell命令或者脚本,并获得其输出(转)

    博客分类:
  • java
阅读更多
下文所述的两个试验在Linux AS3和Jdk5上测试通过。
一、在java程序中跨平台运行shell命令或者脚本,并获得其输出
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class TestCMD {

    /**
    * @param args
    */
    public static void main(String[] args) {
        try {
            Process child = null;
            String systemType = System.getProperty("os.name");
            if (systemType.equals("Linux")) {
                System.out.println("Linux OS!");
                child = Runtime.getRuntime().exec("jmap -h", null, null);
            } else if (systemType.indexOf("Windows") > -1) {
                // If the os is windows, you need to add cmd before command.
                System.out.println("Windows OS!");
                child = Runtime.getRuntime().exec("cmd java -version", null,
                        null);
            }

            // Get the input stream and read from it
            BufferedReader in = new BufferedReader(new InputStreamReader(child
                    .getInputStream()));

            String c = null;
            while ((c = in.readLine()) != null) {
                System.out.println(c);
            }
            in.close();
            return;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


二、推广:根据某个进程特殊的tag获得其进程ID
import java.io.BufferedReader;
import java.io.InputStreamReader;

/*
* @(#)TestGetPid.java 2008-5-21
*
* Copyright (c) 2008
* All rights reserved.
* $
*/

/**
* <strong>Purpose:</strong><br>
* TODO.
* 
* @version 1.0.1 2008-5-21<br>
* @author AxisThinker<br>
* @email ddjoke@163.com
*/
public class TestGetPid {

    /**
    * @param args
    */
    public static void main(String[] args) {
        try {
            Process child = null;
            String systemType = System.getProperty("os.name");
            if (systemType.equals("Linux")) {
                // If the os is linux, you need to add bash before command.
                System.out.println("Support Linux os!");
                child = Runtime.getRuntime().exec("ps -Af", null, null);
            } else if (systemType.indexOf("Windows") > -1) {
                System.out.println("Not support windows!");
            }

            // Get the input stream and read from it
            BufferedReader in = new BufferedReader(new InputStreamReader(child
                    .getInputStream()));

            String c = null;
            // Only get the first line of bash's output.
            while ((c = in.readLine()) != null) {
                //这里this.name=GOS.CORE就是我要找的某个进程的特殊tag,各位可以换成你想找的进程
                if (c.contains("this.name=GOS.CORE")) {
                    c = c.substring(c.indexOf(" "), c.length());
                    c = c.trim();
                    c = c.substring(0, c.indexOf(" "));
                    c = c.trim();
                    System.out.println(c);
                    break;
                }
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}


三: 高级应用: 通过ssh的配置,远程调用其他主机的命令,并在本地得到其输出,中间不用输入密码
第一步:需要配置ssh。配置方法简要如下:
    首先,例如我想用本地的lxy账户登陆远程节点A的lxy1账户,那么首先进入本地/home/lxy目录,在这个目录下有一个隐藏目录.ssh,进入这个目录,利用ssh-keygen命令来生成本用户的公私钥对,可以利用-t参数来指定生成方法:一般用rsa方法。此时,会要求你输入key的密码,直接回车就可以。如果你输的话,就一定要输入4位以上的密码,而且,以后你用ssh的时候就要输入这个密码。所以,建议不输入。
    然后会在.ssh目录下生成两个文件,例如id_rsa和id_rsa.pub,利用vi拷贝id_rsa.pub中的内容到远程节点A的lxy1账户目录下的.ssh目录里面的authorized_keys文件里。这样,以后你在本地以lxy用户身份利用ssh命令用节点A的lxy1账号登陆A节点,就不用再输入密码了。而且,执行:ssh lxy1@A ls 就能直接返回远程节点A的/home/lxy1/目录结构,不用输入密码。

第二步:编写程序
import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
*Author: AxisThinker
*Email: ddjoke@163.com
*/
public class TestCMD {

    /**
    * @param args
    */
    public static void main(String[] args) {
        try {
            Process child = null;
            String systemType = System.getProperty("os.name");
            if (systemType.equals("Linux")) {
                System.out.println("Linux OS!");
                child = Runtime
                        .getRuntime()
                        .exec(
                                "ssh gos@10.61.0.215 bash -c \"$JAVA_HOME/bin/jmap -heap 10191\"");
                   //这里有两点需要注意:第一你要运行的命令需要用bash -c引导。这样是告诉shell,后面的是一条指令,并且要在远端解释环境变量;二是要用转义\"来讲这个指令包起来,否则的话远端会以为jmap是一个指令,-heap是一个指令等等。
            } else if (systemType.indexOf("Windows") > -1) {
                // If the os is windows, you need to add cmd before command.
                System.out.println("Windows OS!");
                child = Runtime.getRuntime().exec(
                        new String[] { "cmd", "java", "-version" }, null, null);
            }

            // Get the input stream and read from it
            BufferedReader in = new BufferedReader(new InputStreamReader(child
                    .getInputStream()));

            String c = null;
            while ((c = in.readLine()) != null) {
                System.out.println(c);
                if (c.equals("XXX")) {//这里比较重要,由于c = in.readLine()容易发生阻塞,所以,这里用比较土的办法来解决,根据最后一行的返回值来决定其是否退出。
                    break;
                }
            }
            in.close();
            return;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
分享到:
评论

相关推荐

    java调用shell(包含有参数的调用)

    在某些情况下,Java程序需要调用Shell脚本执行特定的操作,比如访问Linux系统命令或者自动化执行一些任务。本文将详细解释Java如何调用Shell脚本,包括如何编写Shell脚本和在Java中如何传递参数。 首先,Shell脚本...

    java控制台输入cmd命令, ssh远程linux shell命令, 并打印命令输出到控制台

    在Java编程中,有时我们需要与操作系统进行交互,执行系统级别的命令,例如在控制台执行CMD命令或者通过SSH连接远程Linux服务器执行shell命令。这在自动化脚本、系统管理或者远程监控等场景中非常常见。本篇文章将...

    shell 脚本调用Java类

    当需要将这两者结合时,通常是为了在Shell脚本中调用Java程序,实现更复杂的系统集成或者自动化流程。 标题"shell 脚本调用Java类"指出我们要讨论的主题是如何在Shell脚本中执行Java程序,尤其是直接调用Java类。...

    java在win下启动bat和在linux下启动shell脚本

    Java编程语言具有跨平台的能力,这使得它在各种操作系统上都能运行。在Windows和Linux环境中,启动批处理脚本(bat)和shell脚本(sh)是常见的任务,特别是在自动化和脚本执行过程中。`RunScript.java`和`...

    java程序产品包模板-内置linux和Windows通用shell启动停止脚本(无需系统安装Java运行环境).zip

    该压缩包文件“java程序产品包模板-内置linux和Windows通用shell启动停止脚本(无需系统安装Java运行环境).zip”提供了一套适用于Java程序的通用打包方案,特别强调了其能够在Linux和Windows操作系统上无缝运行,且不...

    java调用shell脚本

    Java作为一种跨平台的编程语言,提供了多种方式来调用Shell脚本,实现与操作系统的交互。本文将深入探讨Java如何调用Shell脚本以及相关的知识点。 首先,Java通过Runtime类或ProcessBuilder类可以执行外部程序,...

    java 远程调用Shell脚本客户端包

    Java 远程调用Shell脚本客户端包是一个实用的工具,专为开发者设计,使得在Java应用程序中执行远程Shell命令变得简单而高效。这个包的主要功能是通过Java代码发起对远程服务器上的Shell脚本的调用,从而实现跨平台的...

    JAVA操作linux服务器,本文用于启动shell脚本并返回数据,简单易懂,可随时修改

    在IT行业中,Java语言因其跨平台的特性及丰富的库支持,常常被用来进行远程服务器管理。本主题聚焦于使用Java来操作Linux服务器,特别是通过执行shell脚本来获取服务器的反馈数据。以下将详细阐述这个过程涉及的技术...

    java调用shell脚本完美封装

    本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的测试示例。 1. **Java与Shell脚本的桥梁:Runtime类和ProcessBuilder类** Java提供了两种主要的方式来调用外部程序,包括Shell脚本:`...

    linux下运行java程序

    Linux以其稳定性和安全性成为了服务器平台的首选,而Java作为跨平台的编程语言,其程序在Linux上运行同样具有广泛的应用。这篇博文将深入探讨如何在Linux系统中配置Java环境并执行Java程序。 首先,确保你的Linux...

    Linux云计算-Shell脚本100例

    例如,使用Shell脚本来启动、停止Java应用程序,或者通过JMX接口获取运行时信息。 在“Linux云计算-Shell脚本100例@www.java1234.com.pdf”这份资料中,读者可以期待看到一系列实用的Shell脚本示例,涵盖上述提到的...

    shell java

    而`Java`是一种广泛使用的编程语言,适合开发跨平台的应用程序。当`Java`与`Shell`结合时,可以实现更高效、灵活的自动化任务处理。 标题"shell java"暗示了我们要讨论的是如何利用`Shell`脚本来运行和管理`Java`...

    java调用shell

    在IT领域,特别是软件开发与系统管理中,Java与Shell脚本之间的交互是常见的需求,尤其是在自动化运维、批处理任务以及跨平台应用中。本文将深入探讨如何在Java程序中调用Shell脚本,理解其背后的原理,并提供一系列...

    用java 编写的 linux 中的 shell 源代码

    在实际应用中,这样的Java Shell可能用于教学目的,帮助学生理解操作系统原理,或者在无法直接运行Unix/Linux系统但又需要类似功能的环境下使用。此外,对于需要在Java环境中执行脚本或集成命令行工具的开发者来说,...

    linux下执行java程序的sh脚本下载

    在Linux环境中运行Java应用程序时,经常需要通过shell脚本来启动Java程序。这种方式不仅便于自动化部署和管理,还可以根据需求灵活调整运行参数。本文将详细介绍如何在Linux环境下编写并运行用于执行Java程序的shell...

    java 操作脚本启动服务

    3. **跨平台命令执行**:在Java中实现跨平台命令执行,需要考虑不同操作系统下的命令差异。例如,Linux用`ps`查找进程,Windows用`tasklist`;Linux用`kill`发送信号,Windows用`taskkill`。 4. **进程ID获取**:在...

    Java调用linux shell脚本的方法

    本文将详细探讨如何在Java程序中调用Linux shell脚本,并解释相关的关键概念和步骤。 首先,调用shell脚本的基本过程分为以下几个步骤: 1. **设置脚本执行权限**:在Linux系统中,执行一个文件(如shell脚本)...

    shell脚本+ant脚本

    Shell脚本和Ant脚本是两种在IT行业中广泛使用的自动化工具,主要应用于Unix/Linux系统和Java项目的构建。这里我们将深入探讨这两个概念以及它们在实际工作中的应用。 首先,Shell脚本是基于Unix/Linux命令行环境的...

    java远程调shell

    Java远程调用Shell是一种技术,它允许通过Java程序执行远程服务器上的操作系统命令,这在系统集成、自动化运维或跨平台任务调度中非常有用。这里,我们深入探讨如何实现这一功能,以及涉及的关键知识点。 首先,...

    java调用bat批处理与sh脚本

    Java提供了`Runtime`类和`ProcessBuilder`类,这两个类都可以用来执行外部命令,包括运行批处理文件和Shell脚本。 1. **Runtime类**:`Runtime.getRuntime().exec()`方法是Java最基础的执行外部命令的方式。例如,...

Global site tag (gtag.js) - Google Analytics