Bash shell для android

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 (( $ Сообщение отредактировал Cерёгa — 06.05.20, 21:55

Источник

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.

Читайте также:  Wavepad audio editor для андроид

Основное назначение скриптинга в 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 — одно из таких приложений. Если установить и настроить его, операцию бэкапа и восстановления можно будет заскриптовать. Например, следующий простой скрипт сделает резервную копию всех сторонних приложений:

Конструкция $ здесь нужна, чтобы обрезать слово «packages:», которое pm добавляет в начало имени каждого пакета. Чтобы восстановить бэкап, можно использовать либо тот же Helium, либо команду bmgr:

Автозапуск

«Это все круто, но скрипты должны запускаться сами», — скажешь ты и будешь абсолютно прав. Без автозапуска от скриптов толку мало, но это легко исправить, если воспользоваться все тем же 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, гаджетов и древних видеоигр.

Источник

Оцените статью