`
tuhaitao
  • 浏览: 379222 次
  • 性别: 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解释器的问题,这个方法绝对有效。
本人小白,大神轻喷。

相关推荐

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

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

    14-Java操作Linux命令分割合并文本文件1

    2. **Java调用Linux命令** - 在Java中,可以通过`Runtime.getRuntime().exec()`或`ProcessBuilder`类来执行Linux命令。在描述中提到的`getDiskUsage`方法就使用了`ProcessBuilder`来执行`df -hl -P`命令,获取磁盘...

    java调用shell向DataX传递参数,where条件,包含特殊字符

    总之,Java调用shell脚本向DataX传递参数,尤其是在where条件中包含特殊字符时,需要关注字符串转义、shell命令构建以及安全问题。同时,合理设计和使用配置文件能有效提高代码的灵活性和可维护性。

    Java调用Linux CenterOS系统安装的OpenOffice4报错

    在这个特定的问题"Java调用Linux CentOS系统安装的OpenOffice4报错"中,开发者可能在尝试使用Java来自动化处理文档,如转换Office格式,而OpenOffice4提供了一个开源的解决方案,可以将Microsoft Office文档转换为...

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

    在 Java 中,我们可以使用 Runtime.getRuntime().exec() 方法来执行操作系统命令,从而调用 Python 脚本。下面是一个示例代码,演示如何在 Java 中调用 Python 脚本并传递参数: ```java @Async public void ...

    JAVA实现Linux中word转换pdf

    通过Java的Runtime.exec()方法,你可以调用这个命令并传递Word文件和期望的PDF输出路径作为参数。 7. **安全性和错误处理**: 在执行命令行转换时,确保处理可能的异常,如文件不存在、权限问题或者转换失败。同时...

    java执行远程linux服务器命令

    总结,通过Java执行远程Linux服务器命令主要涉及到SSH协议、JSch库的使用,以及可能的工具类库如Apache Commons Exec。这些技术在日常的系统管理和自动化任务中扮演着重要角色,帮助开发者实现远程操作和管理。

    java操作Linux环境

    Java操作Linux环境主要涉及到的是Java对远程系统的交互能力,尤其是通过SSH(Secure Shell)协议进行安全的网络通信。JSCH(Java Simple SSH)是Java中一个常用的库,它提供了SSH2协议的实现,使得Java程序可以执行...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    总的来说,Java调用C语言编写的本地库需要理解JNI和JNA的工作原理,以及它们如何处理数据类型转换、参数传递和本地库的加载。通过这些技术,开发者可以充分利用C/C++的性能优势,同时享受Java的平台独立性和高级抽象...

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

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如运行Linux命令或shell脚本。`Runtime`类是Java标准库提供的一种机制,允许我们在程序中执行操作系统命令。本文将深入探讨如何使用`...

    java执行linux的SH文件

    标题中的“java执行linux的SH文件”指的是在Java程序中调用Linux系统中的Shell脚本进行执行。这通常涉及到Java的Runtime类或者ProcessBuilder类,它们可以用来与操作系统进行交互,执行外部命令。 1. **Java运行...

    Java JNI调用动态库(Linux、Windows)的实现步骤

    本篇文档将详细介绍如何在 Linux 和 Windows 平台上使用 Java 调用动态链接库(DLL 在 Windows 上称为 .dll 文件,在 Linux 上称为 .so 文件)。这通常涉及到三个主要步骤:编写 Java 接口、定义 C/C++ 头文件和实现...

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

    本主题聚焦于使用Java来操作Linux服务器,特别是通过执行shell脚本来获取服务器的反馈数据。以下将详细阐述这个过程涉及的技术点和步骤。 首先,我们需要理解Java中的SSH(Secure Shell)框架,它允许我们在安全的...

    在Linux系统下用java执行系统命令.doc

    在Linux系统下,Java提供了通过`Runtime`类和`ProcessBuilder`类来执行系统命令的功能。本文将深入探讨如何在Java程序中执行Linux命令,并解决遇到的一些常见问题,特别是涉及通配符`*`的使用。 首先,让我们看一个...

    java调用window操作系统文本转语音并生成播放文件

    总之,Java调用Windows操作系统实现文本转语音并生成播放文件,涉及到JNI、COM组件、DLL编程、音频处理等多个方面,需要对Java和Windows API有深入理解。通过适当的技术选择和优化,可以创建出高效、灵活的文本转...

    登录linux执行命令

    Expect4j库模仿了Unix的"expect"工具,使得程序能够自动发送输入,匹配输出,从而实现与远程Linux系统的自动化交互。在这个场景下,程序接收到AMQ的消息后,会利用expect4j库建立SSH连接到目标Linux服务器,然后执行...

    Java项目linux启动脚本以及日志分割安装软件

    在IT行业中,尤其是在服务器管理和自动化运维领域,熟练掌握Linux系统操作和相关工具的使用是至关重要的。本资源主要涉及两个核心知识点:Java项目的Linux启动脚本和日志分割工具cronolog。 首先,让我们来深入理解...

    Linux下Java中调用可执行程序

    总结,Java在Linux下调用可执行程序涉及的关键点包括获取运行时环境、创建进程、处理输入/输出流、跨平台兼容性、批处理文件的使用以及正确处理参数路径。正确理解这些步骤有助于在Java程序中有效地集成和控制外部...

    java调用cmd创建目录和复制文件

    - 安全性:避免命令注入攻击,不要直接将用户输入拼接到命令字符串中,而是应使用参数化方式传递。 总结一下,通过Java调用CMD创建目录和复制文件涉及的关键知识点包括: 1. Java的Runtime类和ProcessBuilder类 2. ...

Global site tag (gtag.js) - Google Analytics