- Bash-скриптинг на устройствах под управлением ОС Android: первые шаги
- Программирование для смартфонов
- Bash shell для android
- Shell-скриптинг в среде Android
- Содержание статьи
- Особенности Android-окружения
- Хакер #185. Докажи баг!
- Первый пример
- Автозапуск
- Запуск скриптов до и после установки прошивки
- Что еще?
- Вместо выводов
- Евгений Зобнин
Bash-скриптинг на устройствах под управлением ОС Android: первые шаги
Программирование для смартфонов
Все мы (ну или почти все) когда-то пользовались смартфонами под управлением ОС Symbian. Многим из нас не хватало функционала уже существующего ПО, и тогда на смартфоне появлялся Python и множество самописных программ на нём же. Такие программы назывались скриптами, а написать скрипт мог любой желающий, вооружившись одним лишь текстовым редактором.
Теперь же многие из нас обзавелись смартфонами, управляемыми ОС Android, которая, как известно, создана на базе ядра Linux.
А одной из отличительных особенностей GNU/Linux является bash — одна из наиболее популярных современных разновидностей командной оболочки UNIX.
Вооружаемся всем необходимым:
- во-первых, нам нужно получить права пользователя root;
- во-вторых, нам нужен эмулятор терминала — этот (требует Android 1.5+) или любой другой;
- в-третьих, нам нужен BusyBox — набор UNIX-утилит командной строки — этот (требует Android 1.6+) или любой другой;
- в-четвёртых, нам пригодится текстовый редактор — этот (требует Android 1.6+) или любой другой.
Опционально можно поставить модифицированный bash , положив его в .
Итак, весь необходимый софт установлен. Запустив эмулятор терминала, попробуем выполнить какую-нибудь команду, например, посмотрим информацию о системе:
Особой пользы нам эта команда не принесла, попробуем выполнить что-нибудь более полезное.
Подробнее о командах вы можете узнать, например, в том же самом Advanced Bash-Scripting Guide или спросить у наших линуксоидов .
Наверное, сейчас нам пригодится новый пароль из, допустим, 30 случайно взятых символов (букв, цифр и знаков препинания):
Скриншот
Как вы уже догадались, довольно неудобно каждый раз вводить в терминале такую команду. Поэтому, чуть-чуть изменив текст, мы создадим скрипт, который генерирует пароль указанной пользователем длины и НВПС сохраняет его в текстовый файл:
Скриншот
Скрипт написан и сохранён. Пытаемся его выполнить, но результат не радует:
А всё потому, что у нас карта памяти отформатирована в файловой системе FAT. (Есть предположение, что на носителе с файловой системой ext4 всё заработает искаропки). Посему кладём наш скрипт в
, не забыв после этого разрешить системе его выполнение командой
или с помощью вашего любимого файл-менеджера.
Запускаем скрипт:
Скриншот
Всё работает, задача выполнена.
Скриншот
Бонус: можно заставить систему выполнять скрипт при загрузке, о чём подробнее написано здесь .
Источник
Bash shell для android
Устройство или ОС, прошивка: Все платформы
Тема предназначена для создания нового, обсуждения и адаптации существующего, накопления готового кода, интерпретируемого bash и/или shell оболочкой.
Это не стол заказов! Обращаясь за помощью, пожалуйста, выложите уже имеющийся код своих наработок под тег CODE (это крайне желательно) и укажите ОС, в которой он будет выполняться. От трудозатрат на грамотное и внятное оформление сообщения напрямую зависит желание ответить на него и, собственно, качество полученного ответа.
Обсуждение взаимодействия с API Android OS при помощи bash/shell оболочки просьба обсуждать в соответствующей теме: Скрипты на shell под Android.
Здесь же будем пытаться накапливать опыт влияния на устройства под управлением Android, на саму ОС или связанные с ней файлы используя только bash/shell на самом устройстве, с ПК, планшета, телефона и т.д..
Сообщение отредактировал Идите Лесом — 27.04.20, 01:13
nonamer1990, вот мой более расширенный вариант перевода rwxrwxrwx 0777 с графическими плюшками для удобовосприятия.
Добавлено 27.04.2020, 08:44:
nonamer1990, если только переходить на xargs, вместо for и наверное юзать hexdump.
Поделюсь 2 хорошими утилитами для build.prop, файлов настроек и прочего на линукс(андройд) системах
Используется для подмены значения определенного параметра
# команда (поиск строки или слова) (новое значение) (файл)
Сообщение отредактировал shimmеr — 27.04.20, 11:28
С хорошим процессором телефон не почувствует разницы. Но размер скрипта уменьшился в разы. Используем развернутый файл все с того же пути в
примере.
Вот пример от ув. nonamer1990, где прикреплено сразу два в k_pack.zip, busybox и magiskboot : Скрипты, твики, собери их все (Пост nonamer1990 #95887370)
P.S. Все рекомендации на улучшение только всегда приветствуются.
Сообщение отредактировал ziand — 29.04.20, 14:07
ziand, Notepad-а нет на Андроид/Линукс, зато есть cat (изначальное значение которого — склеивать файлы) и dd. А вот смещение для dd при считывании можно и изменить или сделать плавающим, используя метку, например exit 0 в теле скрипта. Ну и если размер небольшой — можно и прямо в ОЗУ распаковывать, в любую tmpfs (хоть новую примонтировать) . Вот только удобочитаемость сие.
P.S.: так же можно в тело архива встроить шифрование, проверку хэш-сумм и т.п.
Если пофантазировать, то можно даже скрипт написать для склеивания файла скрипта и полезных прицепов под свои нужды с автоматическим правкой статического смещения для dd и даже указания этого смещения в скрипте. скрипт на скрипт. Но особо лично пока не вижу в этом практического применения, только для спортивного интереса.
#!/system/bin/sh -x
base64 -d file для «последующего использования».
Сообщение отредактировал ziand — 06.05.20, 14:24
Geo_GEO, Не совсем уверен, что это искомое вами, но хотя бы что-то..
Исходники
Собирать пока не пробовал.
Там в исхах уже есть готовый бинарь. «На всякий» достал его (и необходимую для работы либу) и прикрепил ниже под спойлер в архиве. Распаковать и разложить по необходимым местам (с необходимыми правами). Проверял на дроиде 8.1. Пруф:
P.S. Ребят, сорян за оффтоп. Мог бы в личку, но мало ли, может кому ещё понадобится.
В mounts все в порядке, с датой можно работать полностью, но data не доспупна после скрипта и Обновления разделов в TWRP (нужна перезагрузка).
Может чего в коде изменить ?
Сообщение отредактировал ziand — 06.05.20, 16:08
Второе, что после формата mke2fs память устройства 108402MB, а после формата make_ext4fs получается 108786MB именно столько как после формата самим TWRP.
Сообщение отредактировал ziand — 07.05.20, 21:03
Что умеет:
+ вывод по столбцам
+ форматирование цвета буквами (жирность цифрами)
+ медленный построчный вывод в терминале (включается в секции настроек функции)
+ автоматическое определение ширины экрана
+ работает на Линукс и на Андроид (только с приличным busybox принимающим sed вида sed ‘s/[^[:print:]][^[:print:]]/./g’, но можно и изменить эту строку)
Что не умеет:
— медленный побуквенный вывод строк (посчитал лишним эту опцию)
— нет проверки аргументов (подразумевалось её наличие из-вне или её ненужность)
— не умеет переносить слова (слишком тяжело для shell/bash реализовывать данную опцию — не потянет, будут тормоза)
Скрин на строку вида:
Собственно сама функция (минимум описания внутри) :
# Функция форматированного (по столбцу) вывода:
f_print ()
< # Проверок входных данных нет!
# аргументы для ввода: x:y:z ‘текст для вывода’
# x — число, сколько символов пропустить перед началом вывода
# y — цвет, жирность, подчёркивание и т.п. в формате: [жирность][цвет шрифта][цвет фона] (необязательные атрибуты, можно вообще 0 прописать)
# z — ширина вывода (не обязательно)
# пример: f_print 5:0:10 ‘Привет ребята! Как ваши дела? Вывод в столбец — проверка заполнения в ширину экрана терминала. ‘ 20:3g:25 ‘Второй столбец вывода в терминал текстового образца.’ 50:1yr ‘Третий столбец, упирающийся в конец терминала с нормальным переносом.’
# параметры локализации и настройки:
local my_esc=’\033′ # передача escape-последовательности в терминал
local in_line=’\r’ # перевод курсора в начало строки
local sym_fil=’ ‘ # символ для заполнения пустого места в столбцах
local m_column=4 # минимальная ширина столбца
local out_speed=0 # скорость вывода, чем меньше — тем быстрее
####################################
# переменные:
local i=0 # для циклов
local n=0 # для циклов
local check=0 # для проверки
local tmp=0 # временная переменная для расчётов
local arg # передаваемые этой функции аргументы
local data_list[0] # массив с данными
local t_attr # атрибуты жирности, подчёркивания и т.п.
local t_color # цвет шрифта
local b_color # цвет фона
local t_column # ширина окна терминала
#############
# формат data_list:
# data_list[0] — начальная позиция в выводе
# data_list[1] — ширина столбца в выводе
# data_list[2] — атрибуты жирности, подчёркивания, цвета и т.п. в выводе
# data_list[3] — строка для вывода
# data_list[4] — длина строки для вывода
# data_list[5] — позиция в строке для начала вывода
# и т.д.
###################
while ( true )
do
check=0
i=0
while (( $i &2 # установка атрибутов вывода (цвет и т.п.)
echo -n «$
echo -en «$my_esc[0m» 1>&2 # сброс атрибутов по умолчанию
let data_list[n+5]=data_list[n+5]+data_list[n+1]
let data_list[n+4]=data_list[n+4]-data_list[n+1]
if (( $
Источник
Shell-скриптинг в среде Android
Содержание статьи
Android основан на ядре Linux, включает в себя набор стандартных UNIX-команд и простой шелл sh. Все это значит, что мы можем не только использовать командную строку для выполнения низкоуровневых операций, но и писать шелл-скрипты, которые будут выполнять функции, недоступные из графического интерфейса. В этой статье мы поговорим о том, что с их помощью можно сделать и зачем все это нужно.
Для прошлого номера журнала я написал статью о Tasker — системе, которая позволяет автоматизировать работу Android и заменить сотни сторонних приложений. К сожалению, Tasker ограничен высокоуровневыми функциями Android и не позволяет выполнять такие низкоуровневые операции, как монтирование файловых систем, изменение параметров ядра, системных переменных или запуск демонов. Зато все это можно сделать с помощью скриптов.
Сразу оговорюсь, что в этой статье речь пойдет о шелл-скриптах в традиционном для Linux понимании, без использования инструментов вроде SL4A, QPython или Roboto. Главное назначение таких скриптов — изменение поведения системы, параметров ядра, работа с демонами (ADB, например) и тому подобное. Скрипты могут стартовать на этапе загрузки ОС, установки новой прошивки, после тапа по кнопке или же по традиции — из терминала.
В статье я расскажу, как писать такие скрипты, как заставить их стартовать автоматически, привязывать к определенному системному событию. В качестве бонуса также объясню, как заставить консоль восстановления (recovery) выполнить необходимые тебе действия перед установкой или сразу после установки новой прошивки. Начинаем.
Особенности Android-окружения
В самой своей основе, там, где нет Java и Dalvik, Android представляет собой минималистичный Linux-дистрибутив со всеми свойственными ему атрибутами: ядром, системой инициализации, набором библиотек, демонов, консольных команд и, конечно же, шеллом. Последний — это не что иное, как mksh из MirBSD, переименованный в sh; простой командный интерпретатор с поддержкой языковых конструкций классического Bourne shell из UNIX и автодополнением по нажатию Tab.
В качестве комплекта базовых UNIX-команд здесь используется toolbox, своего рода урезанная альтернатива BusyBox, которая позволяет вызывать несколько разных команд из одного бинарника (с помощью симлинков). Toolbox включает в себя очень ограниченный набор команд, в котором нет не только grep или sort, но даже cp. Поэтому для полноценной работы со скриптами настоятельно рекомендуется установка BusyBox, благо в маркете полно бесплатных инсталляторов.
Сам шелл располагается не совсем по адресу, поэтому «шибанг» в скриптах будет выглядеть несколько по-иному, а именно #!/system/bin/sh. Зато о расположении бинарников можно не думать вообще, так как в переменной $PATH всегда прописаны правильные значения. Каталогов для поиска команд тут всегда три: /system/bin/, /system/sbin/ и /system/xbin/ для внешних бинарников. Туда обычно устанавливается BusyBox.
Основное назначение скриптинга в Android — работа с ядром и системными утилитами. Ядро тут стандартное и экспортирует все те же интерфейсы /proc и /sys, через которые можно рулить железом и состоянием системы. Плюс есть набор специфичных для Android утилит, которые будут очень полезны при разработке скриптов:
- pm — менеджер пакетов, позволяет устанавливать, удалять и перемещать софт;
- am — менеджер активностей (Activity), может быть использован для запуска приложений;
- dumpsys — дамп в консоль массы различной информации о состоянии системы;
- screencap — утилита для снятия скриншота;
- screenrecord — утилита для записи скринкастов;
- getprop/setprop — команды для чтения и изменения системных переменных;
- start/stop — запуск и остановка системных служб;
- input — позволяет отправлять в текущее окно кей-коды (эмуляция клавиатуры);
- service — утилита для управления Java-сервисами, имеет очень много возможностей;
- svc — позволяет управлять Wi-Fi, USB-подключением и питанием.
Часть вывода команды dumpsys
Хакер #185. Докажи баг!
Первый пример
Теперь давайте попробуем написать первый скрипт. Делать это лучше на компе, а еще лучше в Linux или редакторе, который умеет создавать текстовые файлы без символа возврата каретки (который при открытии в Android будет выглядеть как ^M в конце каждой строки). Наш первый скрипт будет состоять всего из двух строк, которые делают бэкап всех установленных приложений на карту памяти. Его код (требует BusyBox):
Сохраняем (пусть он называется apk_backup.sh) и перекидываем на смартфон с помощью ADB:
Теперь его нужно запустить. Проще всего сделать это с помощью все того же ADB:
Примерно таким же образом скрипт можно запустить из консоли на самом смартфоне/планшете:
Само собой, такой способ не очень удобен. Поэтому нам нужен какой-то быстрый способ запуска скрипта. Наиболее удобное из найденных мной решений — это приложение QuickTerminal. Устанавливаем, запускаем, переходим на вкладку Quick Command, нажимаем кнопку «+», вбиваем имя (произвольное) и команду (sh /sdcard/apk_backup.sh), в поле Output Type выбираем либо Dialog Output, либо Nothing. В первом случае во время выполнения скрипта на экране появится окно с результатом, во втором все пройдет в фоне. Кому что удобнее. Далее сохраняем и получаем кнопку, с помощью которой скрипт можно будет запустить быстро и легко.
Теперь напишем скрипт, который восстановит наш бэкап:
В нем мы задействовали команду pm с опцией install и флагами -t и -r, которые заставляют систему устанавливать приложения, даже если они подписаны тестовым ключом или уже установлены. Также можно использовать флаг -s, который принуждает приложения к установке на карту памяти (если такая возможность есть), или -f — установка во внутреннюю память устройства.
Почти все команды Android имеют подробную справку
Имея рут, можно даже сделать бэкап настроек всех приложений с помощью копирования и архивации каталога /data/data/, однако восстановить его будет очень проблематично, так как в Android каждое приложение исполняется от имени созданного специально для него Linux-юзера и хранит настройки внутри каталога, принадлежащего этому пользователю. Проблема здесь в том, что идентификатор Linux-юзера для каждого приложения генерируется динамически, поэтому после восстановления бэкапа в заново установленной системе идентификаторы не будут совпадать и приложения не смогут прочитать свои настройки. Придется вручную выяснять ID юзера для каждого приложения и менять права доступа на каталоги с данными.
С другой стороны, мы можем использовать встроенный в Android Backup Manager, позволяющий сторонним приложениям использовать возможности системы для бэкапа и восстановления приложений и их данных. Управлять им можно из консоли (а значит, и с помощью скриптов), но сам по себе он никакого бэкапа не производит, а возлагает эту работу на сторонние приложения. Helium — одно из таких приложений. Если установить и настроить его, операцию бэкапа и восстановления можно будет заскриптовать. Например, следующий простой скрипт сделает резервную копию всех сторонних приложений:
Конструкция $
Автозапуск
«Это все круто, но скрипты должны запускаться сами», — скажешь ты и будешь абсолютно прав. Без автозапуска от скриптов толку мало, но это легко исправить, если воспользоваться все тем же Tasker. Он умеет запускать любые шелл-команды в ответ на любое событие. Чтобы воспользоваться этой функциональностью, достаточно создать новый профиль, выбрать событие (для бэкапа лучшим событием будет время), затем добавляем действие, выбираем Script -> Run Shell, вбиваем команду (sh /sdcard/script.sh), выбираем, если необходимо, файл для записи результата и включаем профиль.
Другой популярный способ автозапуска — это использование средств автоматического исполнения скриптов при загрузке в сторонних прошивках. Сегодня почти все сколько-нибудь известные кастомные прошивки умеют стартовать скрипты из каталога /system/etc/init.d/, а в стоке такую функциональность можно получить с помощью приложения Universal init.d из маркета. С последним, однако, надо быть осторожным, так как оно запускает скрипты не на раннем этапе загрузки, как это происходит в том же CyanogenMod, а уже после полной загрузки системы.
Итак, что мы можем поместить в автозагрузку? Например, скрипт запуска демона ADB в сетевом режиме:
Для подключения к нему с ПК набираем такую команду:
Также мы можем применить некоторые оптимизации подсистемы виртуальной памяти:
Ну или подогнать механизм lowmemorykiller (автоматическое убийство фоновых приложений при нехватке памяти) под наши нужды:
Ну и конечно же, автоматический выбор планировщика процессов:
Все это можно сделать с помощью специализированного софта, но зачем загружать систему дополнительным ПО, которое еще и будет висеть в фоне, когда можно обойтись несколькими простыми скриптами?
Как запустить скрипт с помощью Tasker
Запуск скриптов до и после установки прошивки
Почти каждый, кто устанавливает на свой гаджет стороннюю прошивку, также ставит поверх нее пакет с фирменными приложениями Google (gapps), который включает в себя маркет, YouTube, Gmail и другой софт. Каждый раз, когда происходит обновление прошивки, раздел /system, содержащий ее и gapps, полностью стирается, но приложения Google всегда остаются на месте. Это происходит потому, что, кроме всего прочего, gapps содержит в своем составе специальный скрипт, который размещается в каталоге /system/addon.d/ и запускается консолью восстановления до и после установки прошивки. Этот скрипт делает бэкап и восстановление приложений Google.
Мы можем использовать эту возможность для выполнения наших собственных действий до и после установки прошивки. Вот так, например, выглядит мой скрипт восстановления, который ничего не бэкапит, но подчищает прошивку от мусора сразу после ее установки:
Скрипт удаляет рингтоны, уведомления, движок синтеза речи и несколько приложений. Все эти действия запускаются в ответ на передачу скрипту опции командной строки restore (это делает консоль восстановления после установки прошивки), однако также предусмотрены и варианты обработки таких опций, как backup, pre-backup, post-backup, pre-restore и post-restore. Здесь это просто заглушки, но если бы мы захотели сделать бэкап некоторых файлов и приложений перед установкой прошивки, мы могли бы добавить их в блок backup, как это сделано в скрипте /system/addon.d/70-gapps.sh:
Этот кусок скрипта прекрасно иллюстрирует, как сделать бэкап файлов. Ключевые элементы здесь: функция listfiles, которая при запуске выводит листинг файлов, и функция backupfile, которая является частью консоли восстановления (определена в файле /tmp/backuptool.functions). Она делает бэкап файлов в цикле.
Содержимое /system/addon.d/ в CyanogenMod 11 на Motorola Defy
Скрипт бэкапа приложений Google
По словам разработчика mksh, изначально пользовательские версии Android-смартфонов вообще не должны были иметь в своем составе шелл, но после выпуска смартфона для разработчиков HTC (T-Mobile) G1 он фактически стал стандартной частью системы.
Версии Android 2.3 и ниже вместо mksh использовали минималистичный шелл ash, который входит в базовый комплект всех BSD-систем.
Чтобы получить одни и те же скрипты на всех устройствах, можно использовать приложение DropSync или FolderSync (автоматическая синхронизация через Dropbox).
Что еще?
С помощью скриптов в Android можно сделать намного больше, чем бэкапы и настройка параметров системы. Вот, например, скрипт, который просыпается каждые десять минут и, если уровень заряда батареи стал меньше 30%, отключает Wi-Fi и Bluetooth:
Чтобы скрипт работал в фоне, достаточно вызвать его следующим образом:
А это скрипт, который позволяет быстро заполнять формы, требующие ввода имэйла и пароля (в приложениях и на веб-сайтах):
Запускать его можно разными способами. Либо перед запуском приложения, установив задержку:
Либо повесить на какое-то событие Tasker, например на взмах смартфоном. Другой вариант — использовать буфер обмена. В Android, чтобы вставить нужный текст в буфер обмена, достаточно выполнить такую команду:
Не ахти как удобно, зато работает. Как мы можем использовать такую функциональность? Например, сделать простенький скрипт clip.sh:
Соль в том, что скрипт можно вызывать через удаленный ADB либо вообще поместить в /system/etc/init.d/, заменив $1 на нужный текст. Так нужные нам данные всегда будут под рукой, а бесполезный на смартфоне механизм копирования/вставки получит хоть какое-то назначение. Консольные команды можно использовать и для более высокоуровневых операций, например позвонить по указанному номеру:
Или просто открыть окно номеронабирателя с нужным номером:
Примерно таким же образом можно отправить SMS:
Скрипт принимает два аргумента: номер телефона и содержимое SMS. После запуска он откроет окно SMS-приложения, вставит в него нужный текст, а затем нажмет кнопку Enter для отправки, после чего окно закроется.
Другие полезные при скриптинге команды:
- Перезагрузка в режим recovery:
- Мягкая перезагрузка (без перезапуска ядра):
- Открыть нужное приложение (в данном примере — «Настройки»):
- Открыть веб-страницу:
- Сообщить приложениям о низком уровне заряда батареи (есть софт, который при этом снижает свою активность):
- Изменить MAC-адрес:
- Активировать вибратор:
- Включить фонарик:
- Проиграть файл (может не сработать):
- Отключить указанное приложение (можно организовать цикл для отключения bloatware по списку):
- Получить список приложений, которые имеют уведомления в строке состояния:
- Оптимизировать внутренние базы данных с настройками (можно добавить скрипт в автозагрузку, требуется BusyBox):
- Переключить Wi-Fi-тизеринг на основной интерфейс (нужно для обмана операторов, которые ограничивают скорость соединения при раздаче интернета по Wi-Fi):
Для «отлова» нажатий кнопок можно использовать команду getevent
Вместо выводов
Для кого-то все описанное в статье может показаться несколько надуманным. Дескать, все это можно сделать с помощью стандартного софта и Tasker. Но зачем использовать тяжелый Java-софт там, где нужное действие можно выполнить с помощью простенького скрипта, который не занимает лишней памяти и может быть легко перенесен на другое устройство? Скрипты удобны, просты, быстро отрабатывают и дают возможность тонкой настройки под себя.
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
Источник