简单的不带通配符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.
分享到:
相关推荐
在某些情况下,Java程序需要调用Shell脚本执行特定的操作,比如访问Linux系统命令或者自动化执行一些任务。本文将详细解释Java如何调用Shell脚本,包括如何编写Shell脚本和在Java中如何传递参数。 首先,Shell脚本...
2. **Java调用Linux命令** - 在Java中,可以通过`Runtime.getRuntime().exec()`或`ProcessBuilder`类来执行Linux命令。在描述中提到的`getDiskUsage`方法就使用了`ProcessBuilder`来执行`df -hl -P`命令,获取磁盘...
总之,Java调用shell脚本向DataX传递参数,尤其是在where条件中包含特殊字符时,需要关注字符串转义、shell命令构建以及安全问题。同时,合理设计和使用配置文件能有效提高代码的灵活性和可维护性。
在这个特定的问题"Java调用Linux CentOS系统安装的OpenOffice4报错"中,开发者可能在尝试使用Java来自动化处理文档,如转换Office格式,而OpenOffice4提供了一个开源的解决方案,可以将Microsoft Office文档转换为...
在 Java 中,我们可以使用 Runtime.getRuntime().exec() 方法来执行操作系统命令,从而调用 Python 脚本。下面是一个示例代码,演示如何在 Java 中调用 Python 脚本并传递参数: ```java @Async public void ...
通过Java的Runtime.exec()方法,你可以调用这个命令并传递Word文件和期望的PDF输出路径作为参数。 7. **安全性和错误处理**: 在执行命令行转换时,确保处理可能的异常,如文件不存在、权限问题或者转换失败。同时...
总结,通过Java执行远程Linux服务器命令主要涉及到SSH协议、JSch库的使用,以及可能的工具类库如Apache Commons Exec。这些技术在日常的系统管理和自动化任务中扮演着重要角色,帮助开发者实现远程操作和管理。
Java操作Linux环境主要涉及到的是Java对远程系统的交互能力,尤其是通过SSH(Secure Shell)协议进行安全的网络通信。JSCH(Java Simple SSH)是Java中一个常用的库,它提供了SSH2协议的实现,使得Java程序可以执行...
总的来说,Java调用C语言编写的本地库需要理解JNI和JNA的工作原理,以及它们如何处理数据类型转换、参数传递和本地库的加载。通过这些技术,开发者可以充分利用C/C++的性能优势,同时享受Java的平台独立性和高级抽象...
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如运行Linux命令或shell脚本。`Runtime`类是Java标准库提供的一种机制,允许我们在程序中执行操作系统命令。本文将深入探讨如何使用`...
标题中的“java执行linux的SH文件”指的是在Java程序中调用Linux系统中的Shell脚本进行执行。这通常涉及到Java的Runtime类或者ProcessBuilder类,它们可以用来与操作系统进行交互,执行外部命令。 1. **Java运行...
本篇文档将详细介绍如何在 Linux 和 Windows 平台上使用 Java 调用动态链接库(DLL 在 Windows 上称为 .dll 文件,在 Linux 上称为 .so 文件)。这通常涉及到三个主要步骤:编写 Java 接口、定义 C/C++ 头文件和实现...
本主题聚焦于使用Java来操作Linux服务器,特别是通过执行shell脚本来获取服务器的反馈数据。以下将详细阐述这个过程涉及的技术点和步骤。 首先,我们需要理解Java中的SSH(Secure Shell)框架,它允许我们在安全的...
在Linux系统下,Java提供了通过`Runtime`类和`ProcessBuilder`类来执行系统命令的功能。本文将深入探讨如何在Java程序中执行Linux命令,并解决遇到的一些常见问题,特别是涉及通配符`*`的使用。 首先,让我们看一个...
总之,Java调用Windows操作系统实现文本转语音并生成播放文件,涉及到JNI、COM组件、DLL编程、音频处理等多个方面,需要对Java和Windows API有深入理解。通过适当的技术选择和优化,可以创建出高效、灵活的文本转...
Expect4j库模仿了Unix的"expect"工具,使得程序能够自动发送输入,匹配输出,从而实现与远程Linux系统的自动化交互。在这个场景下,程序接收到AMQ的消息后,会利用expect4j库建立SSH连接到目标Linux服务器,然后执行...
在IT行业中,尤其是在服务器管理和自动化运维领域,熟练掌握Linux系统操作和相关工具的使用是至关重要的。本资源主要涉及两个核心知识点:Java项目的Linux启动脚本和日志分割工具cronolog。 首先,让我们来深入理解...
总结,Java在Linux下调用可执行程序涉及的关键点包括获取运行时环境、创建进程、处理输入/输出流、跨平台兼容性、批处理文件的使用以及正确处理参数路径。正确理解这些步骤有助于在Java程序中有效地集成和控制外部...
- 安全性:避免命令注入攻击,不要直接将用户输入拼接到命令字符串中,而是应使用参数化方式传递。 总结一下,通过Java调用CMD创建目录和复制文件涉及的关键知识点包括: 1. Java的Runtime类和ProcessBuilder类 2. ...