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

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

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

Очень просто, я хочу сценарий, который автоматически изменит 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) Создал скрипт в нано с этими командами.

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, чтобы понять, почему это не работает, и, следовательно, исправить это.

Любая помощь с благодарностью.

Лучший,

ЧАС.

Детали телефона:

OnePlus 5, рутированный с Magisk

ElementalX Kernel

xXx NoLimits Custom ROM

Изменить 1:

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

1 ответ

Есть несколько причин, почему это не работает:

  • Когда "Отказано в доступе", вы просто имитируете env для контекста вашего скрипта, если вы проверите / proc /PID_OF_YOUR_PROCESS/ env, вы увидите пустой env
  • Если вы используете решение для chroot, такое как GNURootDebian, вы столкнетесь с тюрьмой chroot
  • Оболочка скрипта с рут-правами на андроид-системе дикая, ожидайте проблемы.
  • Предпочитайте выполнение условных цепочек с помощью символов && или || процесс связывания в течение сна '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

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

Другие вопросы по тегам