Как выполнять команды оболочки в Android? - PullRequest
0 голосов
/ 31 июля 2011

Я пытаюсь выполнить команду оболочки через мой код для добавления записи в 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");
    }
}

Здесь есть два метода: ie :hellhellCommand () для сборки команды оболочки и writeIptables () для обновления iptables. Но всякий раз, когда я запускаю программу, logcat отображает следующее предупреждение

"W 19913 su запрос отклонен (0-> 0 / system / bin / sh)"

Но я могу вручную добавить запись через командную строку и добавить ее в iptables, но с помощью приведенного выше кода она не обновляется. Мой телефон рутирован, и я использую Android 2.3.4 с ядром Linux 2.6.29. И я использую внешнюю библиотеку "Roottools" для проверки корневого доступа.

Пожалуйста, помогите мне исправить ошибку.

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

Это работает:

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

Этот код работает нормально.В вашей программе есть пара небольших ошибок.Попробуйте тот, который я вставил.Его рабочий шарм.Всего наилучшего.Я держал это настолько простым насколько возможно, чтобы это было легко понять.Вы все еще можете использовать массивы и другие вещи для фантазии своего кодирования.

И да, тот же самый работает и для команды chmod, где вам нужно передать более одного аргумента.

Для этого просто замените

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

с

"chmod 777 / dev / video0 \ n" (или любым другим системным файлом).

Спасибо.Дайте мне знать, есть ли что-нибудь, что я могу сделать.

1 голос
/ 20 декабря 2013
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-потоке, я думаю, что лучше не ждать для завершения процесса.

0 голосов
/ 31 июля 2011

Попытка использовать команду iptables (с sudo и без), а не просто перебивать конфигурационный файл iptables.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...