简体   繁体   中英

How to execute shell commands in android?

I am trying to execute shell command through my code for adding entry in Iptables. The following is my piece of code

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");
    }
}

Here there are two methods ie, createshellCommand() for building the shell command and writeIptables() for updating the iptables. But whenever I run the program logcat is displaying the following warning

"W 19913 su request rejected (0->0 /system/bin/sh)"

But I can manually add the entry through command prompt and its adding to the iptables but by using the above code its not updating. My phone is rooted and I am using android 2.3.4 with linux kernel 2.6.29. And I am using external library "Roottools" for checking the root access.

Please help me to rectify the error.

This Works:

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();
    }
}

This Code Works fine. There are couple of small mistakes in your program. Try the one i pasted. Its working charm. All the best. I kept it as simple as possible so that it is easy to understand. You can still use arrays and other stuff to fancy your coding.

And yaa the same one also works for chmod command where you need to pass more than one argument.

For this Just replace

"os.writeBytes("reboot\\n");"

with

"chmod 777 /dev/video0\\n"(or any other system file).

Thanks. LEt me know if there is something tat i can do.

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)");
    }
}

This one is a little more compact

You can add "proc.waitFor();" after the Process proc... line to get rid of the unused warning, but rebooting your device takes a few seconds time and if you want to disable some features during the few seconds in your UI-thread, I think its better to not wait for the process to end.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM