请教Android Runtime.getruntime.exec 权限执行命令 权限问题

14:41 提问
android Runtime.getRuntime.exec()方法调用tcpdump抓包但文件无法保存
android内置程序调用tcpdump:
Runtime.getRuntime().exec("/data/local/tcpdump -XvvennSs 0 -w /mnt/sdcard/cap.pcap
-i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 or tcp[20:2]=0x504f");
该命令在cmd上可行,但让程序在模拟器上运行Runtime.getRuntime().exec()没有执行保存到sd卡命令,怎么破?
该处命令改成 “mkdir mnt/sdcard/mydir”是有效果的。
按赞数排序
遇到了同样的问题,求破
其他相似问题18996人阅读
Android(38)
在PC上调用cmd,进行一些常用的命令操作,在Android上的是通过Runtime.getRuntime().exec来执行底层Linux下的程序或脚本(bat)。
首先连接上真机,电脑打开CMD,输入adb-shell,确保你要进行的脚本语言是可以执行的。(比如常见的ping命令)
但是深入一下,发现使用ping命令,并附加一些参数,我们设置 -w 5 了,希望5秒钟如果没有ping通,可以有返回,可是像如下常规的操作,貌似ping下的附加参数是不会起作用的,也就是说在cmd下,我希望ping后5秒没有收到包就返回,但是在android下执行就不会有效果:
Process process =
InputStream instream =
BufferedReader bufferReader =
process = Runtime.getRuntime().exec(command);
instream = process.getInputStream();
bufferReader = new BufferedReader(new InputStreamReader(instream, &GBK&));
while ((readline = bufferReader.readLine()) != null) {
results.add(readline);
Log.i(TAG, &execute command result : & + readline);
int status = process.waitFor();
Log.i(TAG, &execute command :& + command + &, status : & + status);
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (InterruptedException e) {
Log.e(TAG, e.getMessage());
} 这种常规的操作,如果执行一条Ping命令,当在某个ip下卡住ping不通时,就有问题了,会发现代码一直会阻塞在br.readLine()的地方,任何办法都不好解决,网上说的把操作放在另外一个Thread里进行,只是解决了process.waiFor()的阻塞问题。其实也解决不了当进行ping不通时readline阻塞的问题,在ping命令的操作下使用readline并不像读取一个文件,当遇到换行时会结束,ping不通,只能一直阻塞着,除非在外部进行close等操作。
结合国内外论坛,终于找到一个办法,我写成了一个方法类,供大家参考(可直接调用):
package com.vixtel.netvista.gdcmcc.
import java.io.BufferedR
import java.io.DataOutputS
import java.io.IOE
import java.io.InputStreamR
import java.util.ArrayL
import java.util.L
import java.util.L
import android.util.L
* 执行命令行工具类
* @author yangxiaolong
public class CommandUtil {
public static final String TAG = CommandUtil.class.getSimpleName();
public static final String COMMAND_SH = &sh&;
public static final String COMMAND_LINE_END = &\n&;
public static final String COMMAND_EXIT = &exit\n&;
private static final boolean ISDEBUG =
* 执行单条命令
* @param command
public static List&String& execute(String command) {
return execute(new String[] { command });
* 可执行多行命令(bat)
* @param commands
public static List&String& execute(String[] commands) {
List&String& results = new ArrayList&String&();
int status = -1;
if (commands == null || commands.length == 0) {
debug(&execute command start : & + commands);
Process process =
BufferedReader successReader =
BufferedReader errorReader =
StringBuilder errorMsg =
DataOutputStream dos =
process = Runtime.getRuntime().exec(COMMAND_SH);
dos = new DataOutputStream(process.getOutputStream());
for (String command : commands) {
if (command == null) {
dos.write(command.getBytes());
dos.writeBytes(COMMAND_LINE_END);
dos.flush();
dos.writeBytes(COMMAND_EXIT);
dos.flush();
status = process.waitFor();
errorMsg = new StringBuilder();
successReader = new BufferedReader(new InputStreamReader(
process.getInputStream()));
errorReader = new BufferedReader(new InputStreamReader(
process.getErrorStream()));
String lineS
while ((lineStr = successReader.readLine()) != null) {
results.add(lineStr);
debug(& command line item : & + lineStr);
while ((lineStr = errorReader.readLine()) != null) {
errorMsg.append(lineStr);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (dos != null) {
dos.close();
if (successReader != null) {
successReader.close();
if (errorReader != null) {
errorReader.close();
} catch (IOException e) {
e.printStackTrace();
if (process != null) {
process.destroy();
debug(String.format(Locale.CHINA,
&execute command end,errorMsg:%s,and status %d: &, errorMsg,
* DEBUG LOG
* @param message
private static void debug(String message) {
if (ISDEBUG) {
Log.d(TAG, message);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3534371次
积分:13853
积分:13853
排名:第776名
原创:95篇
转载:24篇
评论:677条
(1)(1)(1)(1)(3)(2)(11)(6)(1)(7)(1)(1)(3)(2)(1)(10)(4)(6)(9)(4)(10)(1)(5)(4)(1)(3)(2)(9)(5)(1)(6)Runtime.getRuntime().exec()常见问题 -
- ITeye技术网站
博客分类:
JAVA调用一个bat批处理程序,调用几十次后会莫名的不再执行,无任何异常抛出。千试万试,LOG精细到逐行,只知道走到Runtime.getRuntime().exec()程序就停止了,但打死不知道为什么。那真以为里面有鬼。后来寻摸着Runtime.getRuntime().exec()有问题,真给我找到答案了。
大概原因是,调用Runtime.getRuntime().exec()后,如果不及时捕捉进程的输出,会导致JAVA挂住,看似被调用进程没退出。所以,解决办法是,启动进程后,再启动两个JAVA线程及时的把被调用进程的输出截获。
一下子,整个世界清爽多了。。。
原先程序只有一句:Runtime.getRuntime().exec(strMakePathPath);
后来程序更改为:
Process proc = Runtime.getRuntime().exec(strMakePathPath);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "Error");
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "Output");
errorGobbler.start();
outputGobbler.start();
proc.waitFor();
public class StreamGobbler extends Thread {
public StreamGobbler(InputStream is, String type) {
this.type =
public void run() {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line =
while ((line = br.readLine()) != null) {
if (type.equals("Error")) {
System.out.println("Error :" + line);
System.out.println("Debug:" + line);
} catch (IOException ioe) {
ioe.printStackTrace();
浏览 18916
浏览: 94828 次
来自: 西安
我到现在才知道,QQQ
不错,解决了困扰我许久的问题,都准备搞flex了
ie下不好用??> java.lang.Runtime.getRuntime().exec执行cmd命令异常
java.lang.Runtime.getRuntime().exec执行cmd命令异常
hllwfb & &
发布时间: & &
浏览:2 & &
回复:4 & &
悬赏:0.0希赛币
java.lang.Runtime.getRuntime().exec执行cmd命令错误HI&
大家好 、 我是第一次来到这个论坛 没有什么分
现在我遇到了一个难题 希望大家能帮忙解决 & 我用 java.lang.Runtime.getRuntime().exec
去执行‘cmd /c imp IGS02/IGS02o5@BILLGIS full=y file=D:/workspaces2.0/SetupProgram/IGS01.dmp log=D:\IGS01.log’ 这个命令 出现的现象是D盘下面log
日志产生了
但是 就是一直不写入东西
当我把控制台停止后
然后里面就会有东西
执行的代码如下 try {
java.lang.Process
process=java.lang.Runtime.getRuntime().exec(cmdsql);
String line=
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line=bufferedReader.readLine()) != null){
System.out.println(line);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
&非常感谢你的帮助
j2me里,几乎不支持任何的命令行即使支持,手机中哪来的D:/workspaces2.0/SetupProgram/这样的路径
hlphlp & &
15:20:45 & &
& & (0)(0)引用
用 process.getErrorStream()
mimnihao & &
15:20:45 & &
& & (0)(0)引用路过学习者
mimosawang & &
15:20:45 & &
& & (0)(0)引用cmdsql 这里面要绝对路径,不能相对路径把exec 执行结果,打印出来查问题方便些mimizhangyue & &
15:20:45 & &
& & (0)(0)引用
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&下次自动登录
现在的位置:
& 综合 & 正文
Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本
Android Runtime使得直接调用底层Linux下的可执行或脚本成为可能
比如Linux下写个测试工具,直接编译后apk中通过Runtime来调用
或者写个脚本,apk中直接调用,省去中间层或者JNI
这个至少效率应该比较高吧
public class test extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView) findViewById(R.id.text);
Button btn_ls = (Button) findViewById(R.id.btn_ls);
btn_ls.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("ls /mnt/sdcard");
Button btn_cat = (Button) findViewById(R.id.btn_cat);
btn_cat.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("cat /proc/version");
Button btn_rm = (Button) findViewById(R.id.btn_rm);
btn_rm.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("rm /mnt/sdcard/1.jpg");
Button btn_sh = (Button) findViewById(R.id.btn_sh);
btn_sh.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("/system/bin/sh /mnt/sdcard/test.sh 123");
String do_exec(String cmd) {
String s = "/n";
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()));
String line =
while ((line = in.readLine()) != null) {
s += line + "/n";
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
text.setText(s);
echo test.shecho $1
1. exec不等于console命令
2. exec的输入输出流需要自己处理
3. exec执行时阻塞、非阻塞,返回结果问题
4. 注意权限问题
有个讲的比较深入,贴出来研究:
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 java runtime.exec 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信