如何让Android系统或Android应用执行shell脚本

如何让Android系统或Android应用执行shell脚本,第1张

android系统执行shell脚本,需要首先确认用户具有修改shell的权限,使用 process来执行指令,如下代码:

public void execShell(String cmd){

     try{  

    孙橡        //权限设置

            Process p = Runtime.getRuntime().exec("su")  //开始执行shell脚本

            //获取输出流

            OutputStream outputStream = p.getOutputStream()

            DataOutputStream dataOutputStream=new DataOutputStream(outputStream)

            //将命令写入

            dataOutputStream.writeBytes(cmd)

            //提交命令

            dataOutputStream.flush()

            //关闭流 *** 作

         嫌凯罩   dataOutputStream.close()

            outputStream.close()

       }  

       catch(Throwable t)  

        芹闹{  

             t.printStackTrace()  

            } 

    }

android中执行shell命令有两种方式:

1.直接在代码中用java提供的Runtime 这个类来执行命令,以下为完整示例代码。

public void execCommand(String command) throws IOException {

  // start the ls command running

  //String[] args =  new String[]{"sh", "-c", command}

  Runtime runtime = Runtime.getRuntime()

  Process proc = runtime.exec(command)       //这句话就是shell与高级语言间的调用

      //如果有参数的话可以用另外一个被重载的exec方法

      //实际上这样执行时启动了一个子进程,它没有父进程的控纯敬薯制台

      //也就看不到输出,所以需要用输出流来得到shell执行后的输出

      InputStream inputstream = proc.getInputStream()

      InputStreamReader inputstreamreader = new InputStreamReader(inputstream)

      BufferedReader bufferedreader = new BufferedReader(inputstreamreader)

      // read the ls output

      String line = ""

      StringBuilder sb = new StringBuilder(line)

      while ((line = bufferedreader.readLine()) != null) {

          //System.out.println(line)

              sb.append(line)

              sb.append('\n')

      }

      //tv.setText(sb.toString())

      //使用exec执行不会等执行成功以后才返回,它会立即返回

      //所以在某些情况下是很要命的做者(比如复制文件的时候)

      //使用wairFor()可稿搏以等待命令执行完成以后才返回

      try {

          if (proc.waitFor() != 0) {

              System.err.println("exit value = " + proc.exitValue())

          }

      }

      catch (InterruptedException e) {

          System.err.println(e)

      }

  }

}

2.直接安装shell模拟器,即已经开发好的android应用,启动后类似windows的dos命令行,可以直接安装使用,可执行常用的linux命令,应用在附件。

在C语言中调用shell命令的方法实现。

C程序调用shell脚本共有两种方法 :system()、popen(),分别如下:

system()

不用自己去创建进程,系统已经封装了这一步,直接加入自己的命令即可

popen() 也可以实现执游卖行的命令,比system

开销小

以下分别说明:

1)system(shell命令或shell脚本路径)

system()

会调用fork()产生 子历程,由子历程来调用/bin/sh-c string来履行 参数string字符串所代表的命令,此命令履行

完后随即返回原调用的历程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被漠视 。

回值:如果system()在调用银罩/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。 如果

system()调用成功 则最后会返回履行 shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因

此最好能再反省 errno 来确认履行 成功 。

system命令以其简略

高效的作用得到很很广泛 的利用 ,下面是一个例子

例:在/tmp/testDir/目录下有shell脚本tsh.sh,内容为

#!/bin/sh

wget $1

echo "Done!"

2)popen(char

*command,char *type)

popen()

会调用fork()产生 子历程,然后从子历程中调用/bin/sh -c来履行 参数command的指令。参数type可应用

“r”代表读取,“w”代表写入。遵循此type值,popen()会建立 管道连到子历程的标准 输出设备 或标准 输入设备

,然后返回一个文件指针。随后历程便可利用 此文件指针来读取子历程的输出设备 或是写入到子历程的标准 输入设备 中。此外,所有应用 文

件指针(FILE*) *** 作的函数也都可以应用 ,除锋磨闹了fclose()以外。

返回值:若成功

则返回文件指针,否则返回NULL,差错 原因存于errno中。注意:在编写具SUID/SGID权限的程序时请尽量避免应用

popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。

例:C程序popentest.c内容如下:

#include<stdio.h>

main

{

FILE * fp

charbuffer[80]

fp=popen(“~/myprogram/test.sh”,”r”)

fgets(buffer,sizeof(buffer),fp)

printf(“%s”,buffer)

pclose(fp)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12486661.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存