java如何实现系统调用?

author author     2023-03-14     764

关键词:

N久没碰代码..毕业设计不得已重操旧业...

我们的题目要求,是分别在Win和Linux下实现 远程关机,搜集并汇报本地资源信息(OS 版本,CPU信息,磁盘信息,以及其他设备信息等等)。

网络模块已经做好,现在的问题就是,如何能够用Java实现上述操作?

要求:说明 所使用的类库,最好能够提供相关API文档的下载地址
一楼请说中文

通过 java.lang.Runtime 类可以方便的调用操作系统命令,或者一个可执行程序,下面的小例子我在windows和linux分别测试过,都通过。基本原理是,首先通过 Runtime.getRuntime() 返回与当前 Java 应用程序相关的运行时对象,然后调用run.exec(cmd) 另启一个进程来执行命令(cmd为要执行的命令)。

一、运行一个可执行程序
执行一个.exe的文件,或通过已安装的软件打开一个特定格式的文件,如word、chm或mp3等等。
1. 在window下可以直接执行一个.exe文件,如执行我在F盘下的tomcat安装文件,将命令写为:
String cmd = "F:\\\\apache-tomcat-6.0.20.exe";
2. 打开一个word文档。如果系统已经安装了office应用程序,就可以通过调用word的可执行程序来打开一个word文档:
String cmd = "D:\\\\Program Files\\\\Microsoft Office\\\\OFFICE11\\\\WINWORD.EXE F:\\\\test.doc";
当然这样写有点麻烦,我们想打开一个word文档时只要双击就可以了,用不着去找WINWORD.EXE。要是打开每一种格式的文件都得去找它的可执行程序,那可累死了,我们可以通过下面的代码,打开任意一个已知格式的文件(只要安装的打开这种文件格式的软件),相当于用鼠标双击一个文件的图标:
String cmd = "cmd.exe /c start F:\\\\test.doc";

我用C写了一个进程操作的小例子,放在 linux 下编译出的可执行文件叫“fork_wait”,然后把我的java文件编译成TestRunTime.class后扔到 linux 上,在控制台执行 java TestRunTime 命令,TestRunTime 和 fork_wait 程序均运行成功。
String cmd = "./fork_wait";

二、执行一个有标准输出的系统命令
通过调用进程的 getInputStream() 方法,可以获得执行命令的标准输出。在 windows 的cmd控制台窗口和 linux 控制台执行系统名利的格式是一样的,只是输入的命令不同而已。
如要执行windows控制台中ping命令,可写为:String cmd = "ping www.baidu.com";
执行linux的ls命令,可写为:String cmd = "ls -l";

如果要执行一个带参数的命令,可使用 String 数组形式,如:
String[] cmd=new String[3];
cmd[0]="/bin/sh";
cmd[1]="-c";
cmd[2]="ls -l ./";

下面是我写的小例子:
Java代码
package com.why.RunTime;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class TestRunTime
public static void main(String[] args)
//windows
// String cmd = "F:\\\\apache-tomcat-6.0.20.exe";
// String cmd = "D:\\\\Program Files\\\\Microsoft Office\\\\OFFICE11\\\\WINWORD.EXE F:\\\\test.doc";
// String cmd = "cmd.exe /c start F:\\\\test.doc";
String cmd = "ping www.baidu.com";

//linux
// String cmd = "./fork_wait";
// String cmd = "ls -l";
// String[] cmd=new String[3];
// cmd[0]="/bin/sh";
// cmd[1]="-c";
// cmd[2]="ls -l ./";
Runtime run = Runtime.getRuntime();//返回与当前 Java 应用程序相关的运行时对象
try
Process p = run.exec(cmd);// 启动另一个进程来执行命令
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBr.readLine()) != null)
//获得命令执行后在控制台的输出信息
System.out.println(lineStr);// 打印输出信息
//检查命令是否执行失败。
if (p.waitFor() != 0)
if (p.exitValue() == 1)//p.exitValue()==0表示正常结束,1:非正常结束
System.err.println("命令执行失败!");

inBr.close();
in.close();
catch (Exception e)
e.printStackTrace();


参考技术A   
  Java 实现系统调用方式诸多,根据各个开发商以及目标规范要求有所不同,就算是同一个集团内部(如电信、移动)都可以说是百花齐放,一般交互方式有:
  1、URL、SESSION、COOKIE、隐藏域数据COMMIT;
  2、WEBSERVICE;
  3、EJB;
  4、Socket;
  5、接口数据、MQ消息传递等;
参考技术B import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* 远程(本地)调用系统关机命令
* gpedit.msc的”windows设置--〉安全设置--〉用户权利指派“中指派guest具有“从远端系统强制关机”权限
*/

public class ControlCMD

//Runtime
public void execute(String command)

try
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while((line=reader.readLine())!=null)
System.out.println("命 令 行: "+command);
System.out.println("报错信息: "+line);
catch (IOException e)
System.out.println("远程命令 执行失败!!!");
e.printStackTrace();



//指定远程客户机ip,立即关机
public void shutdown(String ip)
execute("shutdown -s -m \\\\"+ip);


//指定远程客户机ip,延时 i 秒关机
public void shutdown(String ip,int i)
execute("shutdown -s -m \\\\"+ip+" -t "+i);


//指定远程客户机ip,延时 i 秒重新启动
public void restart(String ip,int i)
execute("shutdown -r -m \\\\"+ip+" -t "+i);


//以下的程序主方法用于测试
public static void main(String [] args)
ControlCMD ccmd = new ControlCMD();

// ccmd.shutdown("192.168.1.2",10);

ccmd.restart("192.168.1.2", 10);


本回答被提问者采纳

Linux中的系统调用是如何实现的?

】Linux中的系统调用是如何实现的?【英文标题】:HowisthesystemcallinLinuximplemented?【发布时间】:2010-10-0416:37:47【问题描述】:当我在用户模式下调用系统调用时,调用在OS中是如何处理的?它是调用一些可执行的二进制文件还是... 查看详情

java如何实现限制一个接口每天被调用次数为5次?

如果用redis如何实现参考技术A1.定义全局变量GlobalFunction定义属性staticintcount=0当接口被调用时判断count<5时count++接口正常走count=5是返回接口被调用次数上线json系统启动时设置定时器23.59开始执行24小时执行一次设置count为02.Global... 查看详情

java框架如何实现调用接口的实现类的呢?例实现httpsessionlistener接口类被调。

JAVA框架如何实现调用接口的实现类的呢?例实现httpsessionlistener接口类被调。JAVA框架如何实现调用接口的实现类的呢?例实现httpsessionlistener接口类被调用。传递参数给该类呢?将HttpSessionListener接口的实现类配置在web.xml中,服务... 查看详情

如何在ARM64中实现系统调用?

】如何在ARM64中实现系统调用?【英文标题】:HowtoimplementsystemcallinARM64?【发布时间】:2014-10-1508:49:52【问题描述】:我正在使用arm64汇编编码,我想使用svc指令实现系统调用。我在网上找不到任何有效的arm64系统调用实现。另外... 查看详情

java如何调用本地dll库里面的方法

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。... 查看详情

javaapi_多线程基础_多线程基础1

多线程基础11.如何实现多线程?由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。Java是不能直接调用系统功能的,所以,我们没有办法直... 查看详情

java如何调用dll?

jni编写的dll需要有包含对应本地方法的类文件,如果是c语言编写的dll,java工程没有包含对应本地方法的类文件那测试类还怎么调用这个dll?JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器... 查看详情

Java中的用户程序如何进行系统调用/调用内核子程序?

】Java中的用户程序如何进行系统调用/调用内核子程序?【英文标题】:HowuserprogramslikeinJava,makesystemcalls/callkernelsubroutines?【发布时间】:2013-11-0914:32:20【问题描述】:我想弄清楚用户空间程序和操作系统交互。在文件I/O的上下文... 查看详情

如何在 Java 中调用系统控制台?

】如何在Java中调用系统控制台?【英文标题】:HowtocallforthesystemconsoleinJava?【发布时间】:2012-05-1619:49:01【问题描述】:我制作了一个基于控制台的Java应用程序,但每次我尝试通过单击它来启动.jar文件时,程序似乎正在运行,... 查看详情

.net下实现配置化调用java开发的webservice

...无法实现配置IP的形式进行替换调用服务,那这个问题该如何解决?  笔者测试发 查看详情

如何实现一个系统调用,它可以在不进入内核日志的情况下检查自身是不是已成功执行?

】如何实现一个系统调用,它可以在不进入内核日志的情况下检查自身是不是已成功执行?【英文标题】:Howtoimplementasystemcallthatcouldcheckifitselfhasbeensuccessfullyexecutedwithoutgoingtothekernellog?如何实现一个系统调用,它可以在不进入内... 查看详情

java调用域控服务实现部门用户增删改查(代码片段)

 原创内容,爬取请指明出处:https://www.cnblogs.com/Lucy151213/p/11005298.html公司做大后,用到的系统就会越来越多,来个新员工,需要在HR系统添加,然后再到域控系统添加,可能还需要到NC,OA等系统添加账号。后来公司引入总线... 查看详情

springboot系统初始化器是如何别调用的,以及实现原理

1、ApplicationContextInitializer的作用上下文刷新即refresh方法前调用用来编码设置一些属性变量通常用在web环境中可以通过order接口进行排序 2、进入run方法  进入准备上下文prepareContext方法  进入applyInitializers方法。... 查看详情

java做投票系统

用java做投票系统,如何设计,如何实现,希望有大神帮忙。。。。高分我用的是SQLserver2008,有代码的麻烦发给我一下。限java的,300分。java做投票系统,设计程序如下:importjava.util.Set;//调用java.util.Setimportjava.util.HashSet;//调用java... 查看详情

strace如何获得系统调用相关信息

...、系统调用的返回值等信息。这些我们就可以看一下他是如何获得这些信息的。我们知道,在Linux系统中,不同的体系结构使用的系统调用方法可能并不相同。例如386通常是用的是eax表示系统调用号,然后使用ebx、ecx、edx、esi、e... 查看详情

java中如何设计异步调用接口,用监听实现异步结果的通知

一个接口用来往第三方发送请求数据,另一个接口是第三方调用,推送返回结果有没有相应代码参考技术A向对方注册本地的接收接口像微信~~~~~~~~追问能说下具体实现吗 查看详情

在linux操作系统中如何截获系统调用

参考技术Ahistory#记录历史命令,算是截获你的系统调用命令了 参考技术B当然可以调用另一个啦,必须的,否则你就是打算实现内核的全部系统调用了 查看详情

java调用r脚本

...清楚如下几个问题:1)java调用R的方式有哪些及每种方式如何使用?2)这 查看详情