在android程序中调用shell命令与脚本

最近做android的一个功能就是调用shell命令来进行一些系统级别的操作,比如说是关机开机之类的,现在总结一下具体的用法以及遇到的坑(基于我所用到的,没用到的我就不说了)

(1)

Runtime.getRuntime().exec("ls");

这是最简单的一种,你输入后就能就会执行ls命令,如果要获得输出的话可以这样写

Process p = Runtime.getRuntime().exec("ls");
                String data = null;
                BufferedReader ie = new BufferedReader(new InputStreamReader(p.getErrorStream()));
                BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String error = null;
                while ((error = ie.readLine()) != null
                       && !error.equals("null")) {
                    data += error + "\n";
                }
                String line = null;
                while ((line = in.readLine()) != null
                       && !line.equals("null")) {
                    data += line + "\n";
                }

                Log.v("ls", data);

(2)

但是我所要写的需要通过root权限来执行,比如说重启的reboot命令,执行这个的话用普通的身份去执行的话是不会成功的,会报permission denyed,那我们如何才能执行呢,大家都知道adb shell吧,一般root过的机子都能够通过su来获得管理员权限,但是没root过的话就不能了,这就需要把机子进行root了。

root后执行如下命令

Process proc = Runtime.getRuntime().exec(new String[]{"su", reboot});

但是!!!!这个命令貌似不是所有的机子都可以用的,反正我就是遇到这样的坑,从报错信息中可以看到,su和reboot是连起来执行的,所以会解析成su reboot,这样的话会产生一个问题,su 加上 reboot后reboot会被解析成su的命令参数,我们打一下su -help可以看到su的所有参数,明显可以看出reboot不能直接跟在su后面,所以后来我发现一种可以运行的命令如下:

Process proc = Runtime.getRuntime().exec(su -c reboot);

这样机子就能通过root权限执行重启命令了。

(3)

但当我们遇到这样的需求呢!要求运行的shell命令如下

<pre name="code" class="java">Process proc = Runtime.getRuntime().exec(su -c "ls /data");

经过测试,虽然这段代码中的命令在adb shell中能够完美运行,但是放到android的java程序中就跪了。。。在android程序中貌似会把/data"当做su的一段参数导致命令一直执行错误,无奈,搞了好久能没能搞出来,于是就改变了实现方法,用第四种方法去实现了。

(4)

第四种方法也是无奈之举,大家谁有更好的建议欢迎提出。

这种方法就是将所要执行的命令写成一个shell脚本,然后,在程序中调用这个shell脚本,

我把命令写成shell脚本放在了手机的目录中,然后按如下方式调用就成功了。

 Process proc = Runtime.getRuntime().exec("su -s sh  -c /data/initcommand.sh");

注意,这里面有和上面相同的问题,如果不加里面的-c参数的话还是会把后面的文件当做su的参数,当然-c也可以改成-s,这样就能执行initcommand.sh脚本了,如果不行试试将脚本改成777权限。

时间: 2024-12-14 12:24:23

在android程序中调用shell命令与脚本的相关文章

【转载】如何在C语言中调用shell命令

转载自:http://blog.csdn.net/chdhust/article/details/7951576 如何在C语言中调用shell命令 在linux操作系统中,很多shell命令使用起来非常简单,这些shell命令的程序实现已经被底层实现好.有时候需要在程序中调用shell命令,这样可以就不用在控制台上手动输入shell命令了,下面就以三个函数为例来讲解如何在C语言中调用shell命令. 1.system(执行shell 命令) 相关函数 fork,execve,waitpid,po

【译】 AWK教程指南 6在AWK程序中使用Shell命令

awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将下列程序建文件,命名为 count.awk BEGIN { while ( "who" | getline ) n++ print n } 并执行下列命令: $ awk -f count.awk 执行结果将会打印出目前在线人数. 说 明: 1. awk 程序并不一定要处理数据文件,以本例而

Java调用Shell命令和脚本,致力于hadoop/spark集群

前言 说明的是,本博文,是在以下的博文基础上,立足于它们,致力于我的大数据领域! http://kongcodecenter.iteye.com/blog/1231177 http://blog.csdn.net/u010376788/article/details/51337312 http://blog.csdn.net/arkblue/article/details/7897396 第一种:普通做法 首先,编号写WordCount.scala程序. 然后,打成jar包,命名为WC.jar.

Java调用Shell命令和脚本

1.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRuntime()给我们提供了以下几种exec()方法: Process exec(String command) 在单独的进程中执行指定的字符串命令. Process exec(String[] cmdarray) 在单独的进程中执行指定命令和变量. Process exec(String[] cmd

java001-java调用shell命令和脚本

一.项目需求: 从某一机构获取证书,证书机构提供小工具,执行.sh脚本即可启动服务,本地调用该服务即可获取证书. 问题:linux服务器启动该服务,不能关闭.一旦关闭,服务即停止. 解决方案:java调用shell命令,利用spring容器启动即执行方案. 参考博文:http://zohan.iteye.com/blog/1709136 项目结构: 原码: 1.RuntimeUtils.java 1 package com.csvalue.common; 2 3 import org.sprin

解析如何在C语言中调用shell命令的实现方法【转】

本文转自:http://www.jb51.net/article/37404.htm 1.system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #include<stdlib.h>定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程.在调用syst

[C]在C语言中调用shell命令

本文转自:http://www.jb51.net/article/37404.htm 1.system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #include<stdlib.h>定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程.在调用syst

java程序执行,调用shell命令和shell脚本

  坑呀!记得在start()之后, waitFor()之前把缓冲区读出来打log,否则是阻塞缓冲区,没有输出的 package com.jikexueyuancrm.util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import

java调用shell命令及脚本

shell脚本在处理文本及管理操作系统时强大且简单,将shell脚本结合到应用程序中则是一种快速实现的不错途径本文介绍使用java代码调用并执行shell 我在 -/bin/ 目录下写了jbossLogDelivery.sh,有两个功能{./jbossLogDelivery.sh list} 作用是输出jboss现有的日志列表,{./jbossLogDelivery.sh get logName [email protected]} 作用是将指定的日志发送到指定的邮箱 我在一个web程序中打算整