Невозможно выполнить скрипт в Termux, требующий разрешения SU - PullRequest
0 голосов
/ 29 июня 2018

Так что я обычно не пишу, вместо этого трачу часы на форумах в поисках ответа - но я в полной растерянности.

Что я хочу сделать:

Очень просто на самом деле, я хочу скрипт, который автоматически изменит MAC-адрес на моем OnePlus 5, у меня уже есть все команды, необходимые для этого, и я могу легко выполнить его вручную , получая скрипт однако сделать это? Ох, мальчик ...

Что я пробовал:

Это команды, которые при запуске в termux вручную дают мне нужный результат:

ip link set dev wlan0 down

macchanger --random wlan0

ip link set dev wlan0 up

Теперь причина, по которой я не использую ip link set dev wlan0 address xx: xx: xx: xx: xx: xx, заключается в том, что тогда я должен ввести адрес, тогда как Macchanger может сгенерировать его автоматически. (У меня нет Unix-foo для программного создания MAC-адреса).

Итак, я сделал следующее в хронологическом порядке:

1) С помощью этих команд создал скрипт в nano.

2) Сделал скрипт исполняемым с помощью chmod + x changeMAC.sh

При запуске выдается сообщение об ошибке «Отказано в доступе».

3) Попытка сначала войти в SU, а затем выполнить скрипт, это дает ошибку «macchanger» not found, так как termux теряет среду при вызове su. Поэтому я установил оболочку tsu, которая позволяет вам вызывать tsu и получать su с сохранением среды, эквивалентной su --preserve-environment.

Однако именно здесь я начал стучать головой по столу.

Если я сделаю следующее в терминале termux:

tsu
./changeMAC.sh

Терминал просто сидит там, ничего не делая. Если я тогда наберу «выход» и нажму «возврат», я получу три сообщения об отказе в доступе.

Я пытался обойти ошибку:

4) Использование AutoInput для ввода в termux как пользователь, но он отказался это сделать.

5) Выполнение команд оболочки непосредственно из Tasker> Run Shell, но я подозреваю, что это не работает, потому что пакет macchanger не установлен в области оболочки tasker.

6) Использование su --preserve-environment напрямую, но происходит то же самое!

Итак, подведем итог, мой сценарий выглядит так:

\#!/data/data/com.termux/files/usr/bin/sh

sleep 1

ip link set dev wlan0 down

sleep 1

macchanger --random wlan0

sleep 1

ip link set dev wlan0 up

exit

но:

1) Не будет работать со стандартными привилегиями

2) По-видимому, не выполняется, когда используется tsu / su --preserve-environment, выдавая ошибки при выходе из экземпляра tsu, почти, несмотря на то, что ожидает для завершения экземпляра перед выполнением ...

3) Работает нормально при выполнении вручную из экземпляра tsu.

Мне кажется, я просто недостаточно разбираюсь в тонкостях Unix / Linux / Android, чтобы понять , почему это не работает, и, следовательно, исправить это.

Любая помощь очень ценится.

Лучшее

H.

Телефон:

OnePlus 5, root с помощью Magisk

ElementalX Kernel

xXx NoLimits Custom ROM

Редактировать 1:

Я пробовал 'sudo' из https://gitlab.com/st42/termux-sudo, однако для этого требуется su, который затем не может найти macchanger, и я вернулся к исходной точке.

1 Ответ

0 голосов
/ 09 июля 2018

Существует несколько причин, по которым он не работает:

  • Когда «Отказано в доступе», вы просто имитируете env для контекста вашего скрипта, если вы проверите / proc / PID_OF_YOUR_PROCESS / env, вы увидите пустой env
  • Если вы используете решение для chroot, например GNURootDebian , вы столкнетесь с chroot jail
  • Оболочка скрипта с правами суперпользователя на системе Android является дикой, ожидайте проблемы.
  • Предпочитать выполнение условной цепочки с помощью '&&' или '||' над процессом цепочки сна 'command1; sleep (1); command2; sleep (1)'

Самое простое решение, которое я могу предложить вам, это:

Создайте простое приложение для android, и к своей основной деятельности добавьте:

protected void      onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        String[] env = {"PATH=/su/bin:/sbin:/system/sbin:/system/bin:/su/xbin:/system/xbin:/system/xbin/"};
        DataOutputStream outputStream;
        outputStream = new DataOutputStream(Runtime.getRuntime().exec("su", env).getOutputStream());
        outputStream.writeBytes("ip link set dev wlan0 down && macchanger --random wlan0 && ip link set dev wlan0 up && exit \n");
        outputStream.flush();
        Toast.makeText(this, "Macchanger DONE", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "Macchanger Error", Toast.LENGTH_SHORT).show();
    }
}

Он работает на Nexus 5 Rooter, но вам обязательно нужно добавить кнопку для управления функциональностью, и почему бы не распечатать новый mac, который вы можете найти здесь:

  • cat /sys/class/net/NAME_INTERFACE/address

И если вы хотите автоматизировать это, та же логика, но с Сервисом , а не Активностью .

...