Andorid利用sserver/runtime实现java执行linux程序或脚本

2024-03-15 14:32

本文主要是介绍Andorid利用sserver/runtime实现java执行linux程序或脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

方案一:利用sserver

external/server_mount/socket_server.c

#define THE_PORT 8090

方案二:利用runtime

Runtime runtime = Runtime.getRuntime();

Process process = runtime.exec(cmd);

下面介绍可以独立与Android的方案一:

1.sserver部分可以移植出Android部分代码

socket_server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define THE_PORT 8090
#define CLIENT_NUM 10
#define BUFFSZ 1024int main()
{int socketfd;int clientfd;char buff[BUFFSZ];struct sockaddr_in sa;struct sockaddr_in cliAdd;socketfd = socket(AF_INET, SOCK_STREAM, 0);if(socketfd == -1){printf("socket create error\n");exit(1);}bzero(&sa, sizeof(sa));sa.sin_family = AF_INET;sa.sin_port = htons(THE_PORT);sa.sin_addr.s_addr = htons(INADDR_ANY);bzero(&(sa.sin_zero), 8);if(bind(socketfd, (struct sockaddr *)&sa, sizeof(sa))!= 0){printf("bind failed\n");exit(1);}if(listen(socketfd ,CLIENT_NUM) != 0){printf("listen error\n");exit(1);}else{printf("listening\n");}socklen_t len = sizeof(cliAdd);int closing =0;while( closing == 0 && (clientfd = accept(socketfd, (struct sockaddr *)&cliAdd, &len)) >0 ){int n;while((n = recv(clientfd,buff, BUFFSZ-1,0 )) > 0){printf("received data = %s\n",buff);printf("received bytes = %d\n", n);buff[n] = '\0';proc_cmd(clientfd , buff);if(strcmp(buff, "quit") == 0){//connection closebreak;}else if(strcmp(buff, "close") == 0){//server closeclosing = 1;printf("server is closing\n");break;}}close(clientfd);}close(socketfd);return 0;
}
void proc_cmd(int sockfd,char buf[])
{char cmdbuf[BUFFSZ];char fpath[64] = "/data/mtinfo";FILE *fp;printf("proc_cmd now\n");sprintf(cmdbuf,"%s 2> %s",buf,fpath);if(-1 == system(cmdbuf)){printf("system call failed\n");exit(1);}if((fp = fopen(fpath,"r")) == -1){printf("open file %s failed\n",fpath);exit(1);}if(!fgets(cmdbuf,sizeof(buf),fp))//cmd successed{printf("----->cmd successed\n");if(send(sockfd,"ok",2,0)<0){perror("send error");exit(1);}		}else//fail{printf("----->cmd fail\n");if(send(sockfd,"fail",4,0)<0){perror("send error");exit(1);	}		}
}

gcc socket_server.c -o server

2.java部分

HelloWorld.java

public class HelloWorld{public static void main(String args[]){System.out.println("Hello World!");RootSeeker.exec("ls");      }
}
RootSeeker.java

//package com.android.server.am.utils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;//import android.util.Log;public class RootSeeker {private static final String TAG = "RootSeeker";private static final int SOCKET_PORT = 8090;private static final String SOCKET_IP = "127.0.0.1";public static int exec(String cmd) {Log.d(TAG, "<-----------------in exec() start --------------------->");//Log.d(TAG, "exec cmd: " + cmd);Socket socket;BufferedReader in;PrintWriter out;char []buf = new char[256];int ret = 0;try	{socket = new Socket(SOCKET_IP, SOCKET_PORT);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(),true);BufferedReader line = new BufferedReader(new InputStreamReader(System.in));out.println(cmd);if (in.read(buf) != -1 && new String(buf).equals(new String("ok")))ret = 0;else ret = -1;//Log.d(TAG, "command execute " + ((ret == 0) ? "ok" : "false") + ", return: -->" +buf);line.close();out.close();in.close();socket.close();return 0;	//FIXME}catch (IOException e){//Log.d(TAG, e.toString());}return 0;}public static boolean chmod(String fileName) {String cmd = "chmod 777 " + fileName;System.out.println("cmd =" + cmd);try {Runtime runtime = Runtime.getRuntime();Process process = runtime.exec(cmd);return true;} catch (Exception e) {e.printStackTrace();return false;}}}
javac RootSeeker.java HelloWorld.java

3.运行

一个终端执行./server

另一个终端执行

CLASSPATH=$CLASSPATH:.

echo $CLASSPATH

java HelloWorld

结果分别为:

listening
received data = lsreceived bytes = 3
proc_cmd now
HelloWorld.class  HelloWorld.java  RootSeeker.class  RootSeeker.java  server  socket_server.c


Hello World!














这篇关于Andorid利用sserver/runtime实现java执行linux程序或脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812279

相关文章

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu