`
tuhaitao
  • 浏览: 375403 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java调用linux命令传递参数问题

    博客分类:
  • java
阅读更多

简单的不带通配符linux命令调用非常简单,使用Runtime.getRuntime().exec(command)即可,如果要显示错误,或者

 

输出信息,得到相应的inputStream,既可以打印出信息.

 

但是对于以下命令:

 

ls /var/log/nginx/access.log.*

 

ls /var/log/nginx/access.log.* | grep 2011-05-16

 

grep "test=123&name=opencfg.com" /var/log/nginx/access.log.* > /root/alert.log

 

类似这样的命令,process.exec是不会理解其中的*号与> 甚至管道符号|

 

这是由于在linux环境下,我们一般使用bash shell调用这些命令, 而其中的一些符号 诸如:

 

*, ?, >, < , | 这样的符号是通过/bin/bash -c来做解释后再传递给 所调用的命令

 

/bin/bash -c 这个参数已经作为默认命令,在系统启动时加载到运行环境中,所以我们敲以上命令的时候可以省略

 

但对于java的Process来说,不会识别这些符号,因此我们必须强制调用/bin/bash -c来帮我们做符号解释:

 

 

下边是一段测试代码:

 

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * CommandTest
 * 
 * @author opencfg.com
 * @since 0.0.1-SNAPSHOT
 * @version 0.0.1-SNAPSHOT
 * @date 2011-05-17
 */
public class CommandTest {

	public static void main(String[] args) throws Exception {
		// 1.test console args commands
		// exec("args", args);

		String[] commands = new String[] { "/bin/bash", "-c", "grep -h 200.*370.*http /var/log/nginx/access.log.* > /root/test_123.log" };
		String[] commands_ls = new String[] { "/bin/bash", "-c", "ls /var/log/nginx/access.log.*" };

		// 1.test java string commands
		exec("commands", commands);
	}

	public static void exec(String message, String[] args) throws Exception {
		print(message + ":");
		Process process = Runtime.getRuntime().exec(args);
		for (String arg : args) {
			System.out.println(arg);
			System.out.print(" ");
		}
		BufferedReader errorReader = new BufferedReader(new InputStreamReader(
				process.getInputStream()));
		String line = null;
		while ((line = errorReader.readLine()) != null) {
			System.err.println(line);
		}
		errorReader.close();
		BufferedReader infoReader = new BufferedReader(new InputStreamReader(
				process.getErrorStream()));
		while ((line = infoReader.readLine()) != null) {
			System.out.println(line);
		}
		infoReader.close();
		print("");
	}

	public static void print(String[] args) {
		for (String arg : args) {
			System.out.println(arg);
			System.out.print(" ");
		}
	}

	public static void print(String arg) {
		System.out.println(arg);
	}

}
 

 

只要使用了/bin/bash -c 做为前缀命令,java的Process.exec将会以我们熟悉的方式执行bash shell.

 

2
3
分享到:
评论
2 楼 tuhaitao 2011-12-30  
uukaka123123 写道
小弟我是linux小白,啥都不懂。
突然接到用java调用linux完成数据备份的工作,windows测试成功,可到了linux上就啥都不成了。
于是就查看到这篇文章,轻松解决了我的大问题。
实在是感谢作者。
本人证明,如果就是linux解释器的问题,这个方法绝对有效。
本人小白,大神轻喷。

1 楼 uukaka123123 2011-12-30  
小弟我是linux小白,啥都不懂。
突然接到用java调用linux完成数据备份的工作,windows测试成功,可到了linux上就啥都不成了。
于是就查看到这篇文章,轻松解决了我的大问题。
实在是感谢作者。
本人证明,如果就是linux解释器的问题,这个方法绝对有效。
本人小白,大神轻喷。

相关推荐

    使用runtime实现linux命令行或shell脚本多次调用

    使用runtime, 实现java客户端多次调用linux命令或者shell脚本,并返回对应结果或信息

    java 直接调用python脚本,并传递参数代码实例

    主要介绍了java调用python脚本传递参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    linux操作系统课程设计完善代码

    由于传递给系统调用的内存地址参数是虚拟地址,你需要使用UserProcess.readVirtualMemory和UserProcess.writeVirtualMemory在用户进程和内核之间传递内存。 用户进程在虚拟地址空间中使用null-terminated 字符串的...

    java iptables图形管理工具的设计与实现

    本系统主要由系统JSP前台页面,Java Bean,Java源代码,Linux下Iptables防火墙配置文件组成。JSP前台做用户交互及数据传递操作;Java Bean可以提高代码的利用率,它封装了一些本系统重复使用的Java源代码,如:读...

    Linux C程序设计大全

    4.2.4 指针与参数传递 4.2.5 指针类型的意义 4.2.6 void*型指针 4.3 函数的指针 4.3.1 C语言中的函数指针 4.3.2 函数指针的应用——回调函数 4.3.3 函数指针数组 4.4 字符串 4.4.1 字符串与字符数组 4.4.2 字符串与...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    1000道 互联网Java架构师面试题.pdf和JAVA核心知识整理.zip

    书籍1:互联网 Java 工程师面试题 ...25、使用 MyBatis 的 mapper 接口调用时有哪些要求? 26、Mapper 编写有哪几种方式? 27、简述 Mybatis 的插件运行原理,以及如何编写一个插件 等等 书籍2:JAVA核心知识整理

    launch4j java exe制作包工具

    提供了本地弹出屏幕,应用程序图标,JRE搜索或使用绑定的JRE,启动失败反馈,传递命令行参数,ant脚本。  Launch4j是一个开源的安装程序,将您的jar文件打包成操作系统的本地可执行文件,支持Windows, MacOS,Linux...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    jua:适用于Windows,Mac OS X,Linux,Android和iOS上的Java的LuaJIT

    这样,任何接口都可以在Lua中实现,并作为参数传递给任何方法,并且在调用时,等效函数将在Lua中调用,并将结果传递回Java。 快速开始 要将Nonlua包含到您的项目中,可以使用Maven或Gradle。 伪像: 核心: io....

    Java面试宝典-经典

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    Java面试宝典2010版

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    java基础题 很全面

    36. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 11 37. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此...

    java面试题大全(2012版)

    3、用jdom解析xml文件时如何解决中文问题?如何解析? 114 4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你...

    bluez-dbus:使用DBus和bluez的linux操作系统的蓝牙库(http

    蓝巴士 使用和linux操作系统的蓝牙库。 该项目的灵感来自 ,但是它不需要任何包装库,因为它基于使用jnr-unixsocket的dbus-java的较新版本。 该库已经过Ubuntu 16.04.4(AMD64)和bluez库5.54的测试。 从该库的0.1.0...

    jdk1.8 liunx : 8u261 ; windows : 8u221

    Java 8 允许你使用关键字来传递方法或者构造函数引用 我们可以直接在lambda表达式中访问外层的局部变量。 JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。 SE(JavaSE),standard edition,标准版,...

    JNI函数使用

    传递字符串数组 参数传递 JNI调用 代码清单15-10 在Linux平台上调用C函数的例程——Sample3 public class Sample3 { public native String[] stringMethod(String text); public static void main(String[] ...

    Linux下的IMX6ULL-开发板的第一个APP和驱动实验(三)

    在Linux中,应用程序(App)和驱动程序(Driver)是两个不同的概念和...对于开发应用程序,开发人员通常使用标准的编程语言和工具,如C、C++、Python、Java等,并使用Linux操作系统提供的API和库函数来编写应用程序。

    eclipse+maven+svn+linux+easyui宜立方商城

    宜立方商城采用分布式系统架构,子系统之间都是调用服务来实现系统之间的通信,使用http协议传递json数据方式实现。这样降低了系统之间的耦合度,提高了系统的扩展性。为了提高系统的性能使用redis做系统缓存,并...

    基于JAVA的人才招聘系统源码-internprojects:纽卡斯尔学生项目

    基于JAVA的人才招聘系统源码红帽纽卡斯尔学生项目 在 2021 年,此页面将取代为纽卡斯尔理学硕士学生在红帽纽卡斯尔实习的权威信息来源。 不完全是您要找的? 有关全球信息,请尝试 JBoss 研究项目的遗留信息也可在 ...

Global site tag (gtag.js) - Google Analytics