在 Android 应用程序中执行 shell 脚本不显示结果
Posted
技术标签:
【中文标题】在 Android 应用程序中执行 shell 脚本不显示结果【英文标题】:Executing shell script in Android app doesn't show results 【发布时间】:2011-12-08 13:41:35 【问题描述】:我无法弄清楚我的代码发生了什么。我正在尝试创建个人资料应用程序。该设备已植根并包含 BusyBox。我编写了一个 linux 脚本,根据登录的用户交换 /data 和 /cache 分区。
当我从 ADB 执行此脚本时,它运行良好。我认为在应用程序中实现它会相当容易。
#sp登录用户名密码
android 使用新配置文件重新初始化,一切正常。这就是我在 Android 中所拥有的:
Log.v("Profiles", "sp login " + user + " " + password);
Process process = Runtime.getRuntime().exec("sp login " + user + " " + password);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0)
output.append(buffer, 0, read);
reader.close();
process.waitFor();
Log.v("Profiles", output.toString());
记录的唯一输出是我在实际脚本本身中的“回声”。我看不到该脚本中执行的命令的任何结果。例如,当在 ADB 中运行时,所有挂载命令和我正在做的不同事情都有输出。这些都没有在输出字符串中输出。
有什么建议吗?
【问题讨论】:
如果password
包含诸如;
或&
或*
或?
等shell 元字符,您的exec()
调用可能无法按预期执行。如果 Android 允许您访问更像 execve(2)
而不太像 system(3)
的东西,那么使用它是明智的。 (虽然我认为这与您当前的问题无关。)
不。密码中没有特殊字符。只是一个简单的字符串,虽然这是我需要检查的东西。此外,Android 似乎没有 execve,尽管我对此不太了解。
【参考方案1】:
您需要为该进程执行“su”,它将执行您的 shell 脚本。
否则,即使设备已经root,这个进程也没有root权限。
下面的代码是一个示例供您参考。
public void RunAsRoot(String[] cmds)
try
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for(String tmpCmds : cmds)
os.writeBytes(tmpCmds+"\n");
os.flush();
os.writeBytes("exit\n");
os.flush();
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(p.getInputStream()));
// read the output from the command
String s = null;
while ((s = stdInput.readLine()) != null)
System.out.println(s);
catch(Exception e)
Log.e(LOG_TAG, "RunAsRoot exec failed");
【讨论】:
以上是关于在 Android 应用程序中执行 shell 脚本不显示结果的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式在android中使用blktrace命令执行shell脚本?