Невозможно выполнить скрипт в 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.