急问android应用程序如何执行shell脚本命令

小5555 2012-12-26 03:32:40
跪求大神指点~!
小菜在做一个android应用程序,需要执行系统调用命令,然后我考虑将命令写在.sh脚本里,直接调用脚本执行。
但是调用一直不成功。
我具体用到了如下行的函数调用,系统命令写入了xxxxx.sh里
Process proc=Runtime.getRuntime().exec("/system/bin/sh /system/bin/xxxxx.sh");
请懂这个的朋友指点下,谢谢!!
...全文
21685 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_hai_shi 2015-08-18
  • 打赏
  • 举报
回复
我是遇到了这个问题,但是我是用C语言写的应用,执行脚本。 但是好像不支持system("ls -a"); exec(""); 的函数接口
  • 打赏
  • 举报
回复
楼主,请问解决了吗?能否分享下心得,我也遇到了同样的问题,一串命令在命令行中可以正常执行,在代码中执行也没有报错但就是没生效,不知原因在哪啊
面包你大爷 2014-07-30
  • 打赏
  • 举报
回复
楼主 你最后怎么解决的啊?
jinhaize 2014-03-08
  • 打赏
  • 举报
回复
引用 23 楼 blacksilk 的回复:
没人回复啊,我也失败了,有成功的人回一下。
我现在也出现这个问题,cmd下chmod能成功,java代码执行没抛异常,但是文件权限没改变。 都没人有办法么? 网上那些权限修改的方法,都是坑爹的么? 有木有成功过啊
Trinea 2014-02-28
  • 打赏
  • 举报
回复
关于Android中利用Shell执行某些命令已封装成完善的API,可轻松实现如修改hosts,拷贝文件、安装apk及在拥有root权限下执行某些操作等,如拷贝文件如下: String[] commands = new String[] { "mount -o rw,remount /system", "cp /mnt/sdcard/xx.apk /system/app/" }; CommandResult result = ShellUtils.execCommand(commands, true); 具体可以看看这篇文章介绍 http://www.trinea.cn/android/android-java-execute-shell-commands/
blacksilk 2013-12-18
  • 打赏
  • 举报
回复
没人回复啊,我也失败了,有成功的人回一下。
情分 2013-12-09
  • 打赏
  • 举报
回复
问题解决了吗?我也同样的问题,还有就是在android里调用cd /sdcard/都失败
雨焰 2013-07-25
  • 打赏
  • 举报
回复
引用 20 楼 qyqingyan 的回复:
[quote=引用 19 楼 f839903061 的回复:] [quote=引用 18 楼 qyqingyan 的回复:] [quote=引用 17 楼 f839903061 的回复:] [quote=引用 16 楼 qyqingyan 的回复:] [quote=引用 14 楼 f839903061 的回复:] [quote=引用 13 楼 qyqingyan 的回复:] [quote=引用 6 楼 f839903061 的回复:] 这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教![/quote] 我写的例子就是一个button,点击事件就是调用这个方法,这个方法的功能就是指向shell命令, 意思就是你可以将你的*.sh文件里的命令 一条条的通过该方面执行 比如: execShell("cd /"); execShell("busybox touch xxx.txt"); 那么你就会在/目录下找到一个xxx.txt文件,其他的拷贝,粘贴,查询的什么命令同样如此![/quote] 我想执行类似这样的代码: Process p = Runtime.getRuntime().exec("chmod data/data/com.XXX.XXX"); 改变文件的权限,但是这样改变不了。[/quote] 1.你写的这条命令就是错的,正确写法:busybox chmod 777 /data/data/com.XXX.XXX 2.如果在重启设备之后,权限又变回去了,那么你就要重新执行该命令,或者你在源码中修改init.xxx.rc文件,使他不会随着重启而改变[/quote] 在CMD里面用chmod data/data/com.XXX.XXX就可以改权限啊,用你说的busybox chmod 777 /data/data/com.XXX.XXX不可以改啊。 [/quote] chmod ??? com.XXX.XXX ------>???表示的是权限[/quote] 不好意思,我刚才那个写错了,chmod 777 data/data/com.XXX.XXX就可以改权限啊,用你说的busybox chmod 777 /data/data/com.XXX.XXX不可以改啊。这两句在代码里执行都没有成功,前一句在命令行执行成功了,你说的那句没有执行成功![/quote] 那应该是你的系统里面没有使用busybox工具,现在不要纠结于这个问题,搞的现在忘了一开始想要解决什么问题了!
吴朗 2013-07-25
  • 打赏
  • 举报
回复
引用 19 楼 f839903061 的回复:
[quote=引用 18 楼 qyqingyan 的回复:] [quote=引用 17 楼 f839903061 的回复:] [quote=引用 16 楼 qyqingyan 的回复:] [quote=引用 14 楼 f839903061 的回复:] [quote=引用 13 楼 qyqingyan 的回复:] [quote=引用 6 楼 f839903061 的回复:] 这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教![/quote] 我写的例子就是一个button,点击事件就是调用这个方法,这个方法的功能就是指向shell命令, 意思就是你可以将你的*.sh文件里的命令 一条条的通过该方面执行 比如: execShell("cd /"); execShell("busybox touch xxx.txt"); 那么你就会在/目录下找到一个xxx.txt文件,其他的拷贝,粘贴,查询的什么命令同样如此![/quote] 我想执行类似这样的代码: Process p = Runtime.getRuntime().exec("chmod data/data/com.XXX.XXX"); 改变文件的权限,但是这样改变不了。[/quote] 1.你写的这条命令就是错的,正确写法:busybox chmod 777 /data/data/com.XXX.XXX 2.如果在重启设备之后,权限又变回去了,那么你就要重新执行该命令,或者你在源码中修改init.xxx.rc文件,使他不会随着重启而改变[/quote] 在CMD里面用chmod data/data/com.XXX.XXX就可以改权限啊,用你说的busybox chmod 777 /data/data/com.XXX.XXX不可以改啊。 [/quote] chmod ??? com.XXX.XXX ------>???表示的是权限[/quote] 不好意思,我刚才那个写错了,chmod 777 data/data/com.XXX.XXX就可以改权限啊,用你说的busybox chmod 777 /data/data/com.XXX.XXX不可以改啊。这两句在代码里执行都没有成功,前一句在命令行执行成功了,你说的那句没有执行成功!
雨焰 2013-07-25
  • 打赏
  • 举报
回复
引用 18 楼 qyqingyan 的回复:
[quote=引用 17 楼 f839903061 的回复:] [quote=引用 16 楼 qyqingyan 的回复:] [quote=引用 14 楼 f839903061 的回复:] [quote=引用 13 楼 qyqingyan 的回复:] [quote=引用 6 楼 f839903061 的回复:] 这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教![/quote] 我写的例子就是一个button,点击事件就是调用这个方法,这个方法的功能就是指向shell命令, 意思就是你可以将你的*.sh文件里的命令 一条条的通过该方面执行 比如: execShell("cd /"); execShell("busybox touch xxx.txt"); 那么你就会在/目录下找到一个xxx.txt文件,其他的拷贝,粘贴,查询的什么命令同样如此![/quote] 我想执行类似这样的代码: Process p = Runtime.getRuntime().exec("chmod data/data/com.XXX.XXX"); 改变文件的权限,但是这样改变不了。[/quote] 1.你写的这条命令就是错的,正确写法:busybox chmod 777 /data/data/com.XXX.XXX 2.如果在重启设备之后,权限又变回去了,那么你就要重新执行该命令,或者你在源码中修改init.xxx.rc文件,使他不会随着重启而改变[/quote] 在CMD里面用chmod data/data/com.XXX.XXX就可以改权限啊,用你说的busybox chmod 777 /data/data/com.XXX.XXX不可以改啊。 [/quote] chmod ??? com.XXX.XXX ------>???表示的是权限
吴朗 2013-07-25
  • 打赏
  • 举报
回复
引用 17 楼 f839903061 的回复:
[quote=引用 16 楼 qyqingyan 的回复:] [quote=引用 14 楼 f839903061 的回复:] [quote=引用 13 楼 qyqingyan 的回复:] [quote=引用 6 楼 f839903061 的回复:] 这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教![/quote] 我写的例子就是一个button,点击事件就是调用这个方法,这个方法的功能就是指向shell命令, 意思就是你可以将你的*.sh文件里的命令 一条条的通过该方面执行 比如: execShell("cd /"); execShell("busybox touch xxx.txt"); 那么你就会在/目录下找到一个xxx.txt文件,其他的拷贝,粘贴,查询的什么命令同样如此![/quote] 我想执行类似这样的代码: Process p = Runtime.getRuntime().exec("chmod data/data/com.XXX.XXX"); 改变文件的权限,但是这样改变不了。[/quote] 1.你写的这条命令就是错的,正确写法:busybox chmod 777 /data/data/com.XXX.XXX 2.如果在重启设备之后,权限又变回去了,那么你就要重新执行该命令,或者你在源码中修改init.xxx.rc文件,使他不会随着重启而改变[/quote] 在CMD里面用chmod data/data/com.XXX.XXX就可以改权限啊,用你说的busybox chmod 777 /data/data/com.XXX.XXX不可以改啊。
雨焰 2013-07-25
  • 打赏
  • 举报
回复
引用 16 楼 qyqingyan 的回复:
[quote=引用 14 楼 f839903061 的回复:] [quote=引用 13 楼 qyqingyan 的回复:] [quote=引用 6 楼 f839903061 的回复:] 这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教![/quote] 我写的例子就是一个button,点击事件就是调用这个方法,这个方法的功能就是指向shell命令, 意思就是你可以将你的*.sh文件里的命令 一条条的通过该方面执行 比如: execShell("cd /"); execShell("busybox touch xxx.txt"); 那么你就会在/目录下找到一个xxx.txt文件,其他的拷贝,粘贴,查询的什么命令同样如此![/quote] 我想执行类似这样的代码: Process p = Runtime.getRuntime().exec("chmod data/data/com.XXX.XXX"); 改变文件的权限,但是这样改变不了。[/quote] 1.你写的这条命令就是错的,正确写法:busybox chmod 777 /data/data/com.XXX.XXX 2.如果在重启设备之后,权限又变回去了,那么你就要重新执行该命令,或者你在源码中修改init.xxx.rc文件,使他不会随着重启而改变
吴朗 2013-07-25
  • 打赏
  • 举报
回复
引用 14 楼 f839903061 的回复:
[quote=引用 13 楼 qyqingyan 的回复:] [quote=引用 6 楼 f839903061 的回复:] 这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教![/quote] 我写的例子就是一个button,点击事件就是调用这个方法,这个方法的功能就是指向shell命令, 意思就是你可以将你的*.sh文件里的命令 一条条的通过该方面执行 比如: execShell("cd /"); execShell("busybox touch xxx.txt"); 那么你就会在/目录下找到一个xxx.txt文件,其他的拷贝,粘贴,查询的什么命令同样如此![/quote] 我想执行类似这样的代码: Process p = Runtime.getRuntime().exec("chmod data/data/com.XXX.XXX"); 改变文件的权限,但是这样改变不了。
雨焰 2013-07-25
  • 打赏
  • 举报
回复
你如果能确定,在手动执行*.sh是可执行的,那么 execShell(“./xxx.sh”);也是可以的
雨焰 2013-07-25
  • 打赏
  • 举报
回复
引用 13 楼 qyqingyan 的回复:
[quote=引用 6 楼 f839903061 的回复:] 这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教![/quote] 我写的例子就是一个button,点击事件就是调用这个方法,这个方法的功能就是指向shell命令, 意思就是你可以将你的*.sh文件里的命令 一条条的通过该方面执行 比如: execShell("cd /"); execShell("busybox touch xxx.txt"); 那么你就会在/目录下找到一个xxx.txt文件,其他的拷贝,粘贴,查询的什么命令同样如此!
吴朗 2013-07-25
  • 打赏
  • 举报
回复
引用 6 楼 f839903061 的回复:
这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } }
我使用这个没有成功,我很想问一下你是怎么实现的,有具体一些的例子吗?求指教!
陳强-AI中医 2013-03-23
  • 打赏
  • 举报
回复
脚本要有可执行权限
小5555 2012-12-28
  • 打赏
  • 举报
回复
我的shell脚本里的命令在adb窗口里可以顺利执行。 用android程序调用的时候,我在manifest里面设置了system权限:android:sharedUserId="android.uid.system", shell脚本文件在adb里设置了chmod 777权限, 调用脚本的命令:Process proc=Runtime.getRuntime().exec("/system/bin/sh /system/bin/xxxxx.sh"); 我的做法和楼下几位说的差不多,但是最终还是调用不成功,继续求问是什么问题
小5555 2012-12-28
  • 打赏
  • 举报
回复
引用 6 楼 f839903061 的回复:
这是方法,添加到你的应用程序中即可,比较简陋,呵呵! public void execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //获取输出流 ……
你这个代码里哪里执行了shell脚本呢?cmd还是直接命令执行啊,我需要的是执行shell脚本,还没解决,继续求
oyq_yangy 2012-12-28
  • 打赏
  • 举报
回复
“我的shell脚本里的命令在adb窗口里可以顺利执行。” 你是root执行的? 你先确定你的sh脚本执行了吗?还是sh脚本里的命令没成功? exec("/system/bin/xxxxx.sh"); 不是就可以
加载更多回复(8)

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧