如何在android中执行shell命令?

时间:2011-07-31 17:47:55

标签: android shell

我正在尝试通过我的代码执行shell命令,以便在Iptables中添加条目。以下是我的代码

private void createShellCommand(String uidValue_param, String interface_param) {
    // TODO Auto-generated method stub
    StringBuilder cmdScript=new StringBuilder();
    script.append("iptables -A OUTPUT " + interface_param + "-m owner --uid-owner " + uidValue_param + "-j REJECT");
    writeIptables(cmdScript);

}


private void writeIptables(StringBuilder scriptfile) {
    // TODO Auto-generated method stub
    String cmd=scriptfile.toString();
    if(RootTools.isRootAvailable())
    {
        Process exec;
        try {
            exec = Runtime.getRuntime().exec(new String[]{"su","-c"});
            final OutputStreamWriter out = new OutputStreamWriter(exec.getOutputStream());
            out.write(cmd);

            // Terminating the "su" session
            out.write("exit\n");
            out.flush();    
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.e("IPtables updation failed", "Iptable write failed"+e);
        }

    }
    else
    {
        Log.e("Root Access denied", "Access Denied");
    }
}

这里有两种方法,即用于构建shell命令的createshellCommand()和用于更新iptables的writeIptables()。但每当我运行程序时,logcat都会显示以下警告

“W 19913 su请求被拒绝(0-> 0 / system / bin / sh)”

但是我可以通过命令提示符手动添加条目并将其添加到iptables,但是使用上面的代码它不会更新。我的手机已经扎根了,我正在使用android 2.3.4和Linux内核2.6.29。我正在使用外部库“Roottools”来检查root访问权限。

请帮我纠正错误。

3 个答案:

答案 0 :(得分:4)

本作品:

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    execute_reboot();

}
void execute_reboot()
{
    Process reboot;
    try {
        reboot=Runtime.getRuntime().exec("su");
          DataOutputStream os = 
              new DataOutputStream(reboot.getOutputStream());
            os.writeBytes("reboot\n");
            os.flush();

              os.writeBytes("exit\n");
              os.flush();

            reboot.waitFor();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

此代码正常。你的程序中有几个小错误。试试我粘贴的那个。它的工作魅力。祝一切顺利。我保持尽可能简单,以便易于理解。你仍然可以使用数组和其他东西来模仿你的编码。

yaa同样适用于chmod命令,你需要传递多个参数。

为此只需替换

“os.writeBytes(” 重新启动\ n “);”

“chmod 777 / dev / video0 \ n”(或任何其他系统文件)。

感谢。让我知道我能做些什么。

答案 1 :(得分:1)

public static void rebootNow() {
    Log.d(TAG, "Rebooting");
    try {
        @SuppressWarnings("unused")
        Process proc = Runtime.getRuntime().exec(
                new String[] { "su", "-c", "reboot" });
    } catch (Exception ex) {
        Log.d(TAG, "Rebooting failed (Terminal Error)");
    }
}

这个更紧凑

您可以添加“proc.waitFor();”在Process proc ...行之后去除未使用的警告,但是重新启动你的设备需要几秒钟的时间,如果你想在UI线程的几秒钟内禁用某些功能,我认为最好不要等待为了结束这个过程。

答案 2 :(得分:0)

尝试使用iptables命令(使用sudo和不使用),而不仅仅是破坏iptables配置文件。