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 всё заработает искаропки). Посему кладём наш скрипт в
, не забыв после этого разрешить системе его выполнение командой
или с помощью вашего любимого файл-менеджера.
Запускаем скрипт:
Скриншот
Всё работает, задача выполнена.
Скриншот
Бонус: можно заставить систему выполнять скрипт при загрузке, о чём подробнее написано здесь .
Источник
Запуск Linux приложений на android. Часть 2
Итак, в первой части мы говорили о том какие пакеты нам нужны и как их собрать в zip файл пакета обновлений андроид.
Библиотеки портированные на андроид
Несмотря на то что android не является в полной мере POSIX-совместимой ОС, под него все же были портированы некотороые из библиотек, доступных десктопной Linux. Посмотрим, что это за библиотеки.
- SDL — удобная обертка вокруг низкоуровневых мультимедиафункций, используется в основном для разработки игр.
- FFmpeg — конвертация большинства аудио и видеоформатов.
- Qt — начиная с пятой версии, Qt доступна и под андроид.
- Unity — игровой движек.
- Ogre — обертка вокруг OpenGL для работы с 3D графикой
В общем, с точки зрения портирования приложений выбрать из чего есть.
Bash собирать с помощью тулчейна Linaro очень легко — скачиваем исходники с официального FTP и распаковываем:
Выполняем скрипт configure и собираем:
После сборки появится файл bash, который мы оперативно копируем на устройство в системный каталог /system/xbin.
Стоит дать комментарии, почему bash нужно компилировать с помощью тулчейна Linaro. В Bionic, стандартной реализации библиотеки libc в Android, отсутствуют некоторые РОSIХ-совместимые функции, используемые bash (такие, например, как mkfifo() или wctomb()). Соответственно, собрать bash с использованием этой библиотеки без танцев с бубном не выйдет.
[ad name=»Umi 600×217″]
В Linaro же, с другой стороны , используется стандартная РОSIХ- совместимая библиотека
glibc. Поскольку мы собираем bash статически, нам все равно, что используется в Android, — главное, чтобы версия glibc, с которой мы собираем, подошла к ядру. Впрочем, сегодня обратное маловероятно.
Lshw — удобная консольная утилита, позволяющая быстро собрать информацию о всем доступном железе. Компилировать ее (опять же используя Linaro) достаточно просто. Скачиваем последнюю версию, распаковываем и заменяем в фай л ах src/Makefile и src/core/Makefile компилятор С++ на компилятор от Linaro (перемен н ой СХХ нужно присвоить значение arm-unknownlinux-gnueabi-g++), добавив также опцию —static в CXXFLAGS. Затем собираем обычным образом.
Сеанс SSН-соединения с Android. Для разделения терминала используется tmux. В левой части можно увидеть вывод lshw
Это достаточно удобный консольный менеджер процессов для Linux. Для вывода информации он использует библиотеку ncurses, так что для его компиляции потребуется чуть больше времени . Создаем каталог htop, переходим в него и скачиваем ncurses:
Устанавливаем переменную $SYSROOT_ADDITIONS, запускаем configure с нужными параметрами и собираем:
Поскольку нам нет смысла включать поддержку юникода и мыши и мы не собираемся делать эту библиотеку динамической, от ключаем эти опции (а также отключаем поддерж ку языка Ada).
Скачиваем и распаковываем сам htop, предварительно перейдя на уровень выше:
Вновь переопределяем переменные окружения для сборки :
Конфигурируем и собираем:
Все бы хорошо, но после попытки запуска на устройстве вываливается ошибка «Error opening terminal: screen». Лечится это просто — достаем откуда-нибудь каталог terminfo (я его выдернул из Terminal IDE, просто потому, что он оказался под рукой) , копируем в /system/etc и выполняем в терминале на гаджете следующую команду:
После этого htop запустится без заморочек.
Htop, запущенный под Android
Tmux — это менеджер терминалов и более продвинутая альтернатива известного всем админам screen, созданная руками разработчиков OpenBSD. В случае с операционной системой Android его удобно использовать для работы с устройством через adb shell или SSH (например, ходить на TV Вох или НDМI стик под управлением Android).
Для компиляции tmux нам понадобится все та же ncurses, ее можно взять из предыдущей сборки, скопировав каталог rootdir. Помимо ncurses, потребуется библиотека libevent. Создаем каталог tmux, устанавливаем переменную $SYSROOT_ADDITIONS и скачиваем libevent и сам tmux:
Подготавливаемся к сборке tmux:
И наконец, собираем сам tmux:
После сборки и заливки исполняемого файла перед запуском tmux, помимо п еременной TERMINFO, нужно определить переменную TMPDIR — лично я использовал /data/local/tmp.
Стоит заметить , что tmux может работать только от рута, потому что права доступа не позволяют писать в вышеуказа нную папку кому попало.
[ad name=»UMI 600×313″]
Ngrep
А это крайне полезная утилита , позволяющая отлавливать пакеты с заданным паттерном (может быть нужно, например, для отладки RЕSТful-приложений). Для ее сборки п отребуется собрать еще и libpcap. Как обычно, создаем каталог, куда и скачиваем libpcap, распаковываем его и собираем:
С качиваем сам ngrep, распаковываем, собираем :
Разберем опции обоих configure. В случае с libpcap мы отключили поддержку 0-Bus по понятной причине отсутствия его в Android и указали тип захвата пакетов (поскольку компилируем мы в конечном итоге под Linux, то и тип захвата ставим соответствующий). Для ngrep же мы указали путь к заголовочным файлам libpcap и отключили понижение привилегий по причине отсутствия файла /etc/passwd в Android, куда эта функциональность смотрит.
Перехватываем пакеты, содержащие слово google, используя ngrep
LINUX DEPLOY
Компиля ция программ может занять немало времени, да и не всякое приложение можно с легкостью собрать (например, текстовый tоrrеnt-клиент rtorrent потребует сборку liЬtorrent , а эта библиотека, в свою очередь, потянет за собой Boost). И если для пары -тройки приложений это не столь критично, то в случае сборки большего количества трудозатраты становятся слишком велики.
Да и сами приложения в случае статической компоновки могут раздуваться до невообразимых размеров. Однако есть решение и для этой ситуации — Linux Deploy, который с легкостью можно найти в Google Play.
Поскольку Android построен на базе ядра Linux, а изменения в нем не настолько сильны, чтобы мешать запуску обычных РОSIХ-приложений (что и было продемонстрировано выше), существует возможность развертывания сhrооt-окружения (с пробросом соответствующих псевдофайловых систем) и установки в не м userland-чacти дистрибутивов, подде рживающих архитектуру ARM. Приложение Linux Deploy делает именно это, создавая образ и монтируя его как lоор-устройство.
Поддерживаются следующие дистрибутивы:
· Ubuntu;
· OpenSUSE;
· Fedora;
· Arch Linux;
· Gentoo;
· и, наконец, Kali Linux (его наличие, несомненно, обрадует пентестеров) .
Для входа в систему существует два метода: по SSH и через VNC. При наличии SSH-cepвepa в самом Android в Linux Deploy нужно либо его отключить, либо переопределить порт. А если использовать VNC, необходимо доустановить в Android VNС-клиент (рекомендую bVNC).
В данном контейнере можно п роизводить практически те же действия, что и в обычном настольном дистрибутиве Linux, — со скидкой на поддержи ваемую ядром функциональность. Замечу, что контейнер не изолирован от основной системы, и запуск служб в некоторых дистрибутивах не поддерживается по причине использования в них современных систем инициализации. Также стоит помнить, что приложения в контейнере нативные, — это изрядно
кушает батарею.
Заключение
В статье были описаны два (а если считать компиляцию ядра с модулями, то три) метода расширения функциональности на Android. Подведем итоги. Компиляция ядра и модулей имеет смысл только в тех случаях, когда тебе нужна низкоуровневая функциональность — будь то поддержка ФС или, допустим, модуль iptables. В современных стоковых ядрах поддержка загрузки модулей чаще всего отключена, так что для добавления функциональности всяко потребуется компиляция всего ядра.
В случае с компиляцией небольших РОSIХ-приложений можно попытаться использовать гугловский NDK, идущий с Bionic и практически несовместимый с POSIX, а можно использовать сторонний тулчейн для архитектуры ARM, в котором, как правило, есть библиотека glibc, и компилировать приложения статически. Однако следует помнить, что статически слинкованное приложение весит достаточно много, таким образом, нелишним будет еще раз подчеркнуть, что этот метод годится лишь для небольших приложений.
Для запуска крупных приложений можно использовать Linux Deploy, позволяющий развернуть на Android полноценную userland-чacть популярных дистрибутивов. Однако и у него есть недостатки. Во-первых, он изрядно кушает батарею, а во-вторых, размер образа с данной userland-чacтью не может быть больше 4 Гб, так что, если раскатал губу на кучу приложений, закатай ее обратно.
В целом же запуск РОSIХ-приложений в Android вполне возможен — что и было показано в статье. А уж каким способом ты будешь что-то делать, ты волен выбирать сам. Stay freedom.
Источник
Как запустить скрипт BASH на моем Android?
Мой же сценарий BASH работает в Fedora / CentOS.
Но я тестирую один Android eee pad transformer .
Где у меня есть доступ к терминалу, и я написал небольшой тестовый скрипт. Но он не работает, как я могу это исправить? Что я делаю не так?
Следовать за:
Это мой скрипт, который теперь работает:
Может быть, это будет работать при вызове интерпретатора со сценарием?
Я видел, что, хотя указанная ошибка #!/bin/bash была отправлена sh – может быть, это неправильно.
В Android оболочка находится в /system/bin/sh not /bin/sh как в большинстве Unix-подобных систем. Поэтому, даже если вы измените #!/bin/bash на #!/bin/sh он все равно не будет работать. Вам придется использовать #!/system/bin/sh
Android не является дистрибутивом GNU / Linux, поэтому вы не можете ожидать, что все скрипты, работающие на GNU / Linux, также будут работать на Android.
На большинстве Android-устройств не установлен интерпретатор bash. Если вам действительно нужно запустить скрипт через Linux и Android, вы можете попробовать использовать BusyBox, но для этого потребуется укоренение вашего устройства (и, возможно, аннулирование гарантии). Однако даже тогда я не знаю, включена ли утилита ifconfig в BusyBox.
Я настоятельно рекомендую использовать Android SDK для написания приложения, чтобы сделать все, что вы пытаетесь выполнить.
Как уже было сказано, ОС Android (вплоть до 4.0 включительно) не включает в себя интерпретатор BASH (только оболочка). В то время как BusyBox – отличный инструмент, я считаю, что это всего лишь один исполняемый файл, который объединяет выпущенные унифицированные унифицированные утилиты UNIX, но на самом деле не включает в себя BASH-интерпретатор.
Для скомпилированной версии интерпретатора BASH для Android см. Этот раздел форума: http://forum.xda-developers.com/showthread.php?t=537827
Вы можете использовать install Busybox , который предоставляет вам множество утилит, таких как awk, file и т. Д. И Terminal Emulator .
- Создайте файл оболочки с #! / System / bin / sh в качестве первой строки (shebang)
- Теперь поместите заполненный скрипт в / system / xbin или / system / bin и запустите его из эмулятора терминала
Источник