Код Доступа Termux
Статья посвящается любителям CLI в знак солидарности лучшего терминала на OS Android, который испытывает «кошмарную» монополию Google.
Эта диаграмма создана в Termux
Termux — это Android приложение под свободной GPL3+ лицензией: эмулятор терминала для среды GNU/Linux, которое работает напрямую без необходимости рутирования. Минимальный базовый функционал устанавливается автоматически, расширенные возможности подтягиваются с помощью менеджера пакетов и установкой стороннего ПО с git, а продвинутая деятельность на телефоне достигается за счёт рут-прав пользователя и установкой proot дистрибутивов GNU/Linux.
Сам Termux весит ~100 Мб (расширяется на Гб) работает на OS Android v7–11.
Termux-среда — киберпанковские разработки и некоторые пакеты содержат кучу ошибок, исправлением которых при случае занимается сам пользователь или сообщество, что является (по шкале красноглазия) нормой в open source среде (стандартные пакеты так же как и приложение распространяются под свободными, но разными лицензиями — это требования сопровождающих packages). В целом, качество и популярность приложения поддерживается на достаточно высоком уровне в мировом масштабе (звёзды на Github-е; рейтинг/отзывы на GP). В настоящее время технические политики GP vs Termux конфликтуют между собой в результате чего у пользователей новичков может ничего не получаться в CLI с минимальным базовым функционалом из коробки. RTFM и ещё раз RTFM. На Github-е с рекурсией на документацию частые проблемы и их решения достаточно технически-просто расписаны сообществом, по этому стоит лишний раз заглянуть в местную wiki перед постингом своей проблемы на профильном форуме.
Опыт использования Termux
Я уже не помню точно когда и каким образом Termux стал инструментом моей души, но изучать и юзать это чудо стал со времён Android 6. Накопился личный опыт, которым я хотел бы поделиться с читателями и по возможности самому освоить что-то новое (пишите в комментах ваш уникальный опыт использования этого терминала).
В данной работе вербализация пойдет о нижеизложенном со всеми остановками:
управлять серверами через ssh;
скачивать ролики с YouTube;
нарезать видео, создавать gif;
воспроизводить музыку/радио прямо в CLI;
нарезать mp3-бигфайлы (аналогов приложений на Android попросту нет);
редактировать документы;
проверять орфографию: как txt-документов, так и различных статей по url, например, проверка орфографии статей на Habr-e;
генерировать словари различной сложности;
создавать блок-схемы; графики и даже 3d-визуализацию;
тестировать интернет соединение/интерфейс (требуется частично Root);
снифить/сканировать сети (требуется частично Root);
запускать и управлять TOR-сетью;
управлять приложениями и процессами в ОС Android (требуется Root);
защищать любые данные от случайного редактирования/уничтожения;
автоматически бэкапить/шифровать по ночам любые данные в своё облако;
проводить аудит безопасности (об опасности сердить скрипт-кидди с их любимыми: «снифть, парсить, брутить, дампить, сканить, фишить»);
работать с электропочтой;
изучать unix/shell;
программировать на Android (на выбор пользователя. В Termux портированы несколько интерпретируемых и компилируемых языков программирования);
запускать python/php/npm скрипты;
работать с криптографией; стеганографией и цифровыми подписями;
парсить данные;
и даже запускать GNU-gui-софт из CLI.
Дисклеймер
Любые действия и техники исполнения, связанные с рассматриваемыми инструментами в данной статье, являются исключительно ответственностью читателей. Злоупотребление набором инструментов и/или недопонимание может привести к ответственности соответствующих лиц. Автор не несёт ответственность в случае предъявления каких-либо обвинений против каких-либо лиц, злоупотребляющих инструментами/информацией для правонарушений; или сдачи читателями на запчасти своих испорченных гаджетов. Инструменты, упомянутые в этой статье, связанные с бэкапом/пентестом/шифрованием могут нанести ущерб или быть опасными, ознакомьтесь с законами вашей страны/округа и технической информацией. Если вы что-то собираетесь использовать, то используете это на свой страх и риск. Короче, автор ни к чему не призывает, а лишь демонстрирует возможности ПО в ознакомительных целях, что не является руководством к неправомерным действиям или обучающим материалом для сокрытия правонарушений.
Установка и настройка среды Termux
1. Скачиваем и устанавливаем приложение Termux из магазина приложений F-droid (Termux в магазине приложений GP больше не поддерживается и не обновляется с осени 2020 года, вся разработка продолжает осуществляется на Github, но релизы выкладываются в F-droid/Github). Причины с рекурсией описаны здесь.
2. $ termux-setup-storage
Этой командой пользователь предоставляет Termux разрешение на «доступ к хранилищу» (обязательный шаг). После предоставления разрешения приложению у пользователя появится доступ из Termux к диску/общедоступным каталогам Android через ~/storage/shared/* и флэш накопителю ~/storage/external-1/. На Android 11 существуют проблемы с правами: требуется повторно отозвать/дать права «доступ к хранилищу». Перейти в «Настройки Android» → «Приложения» → «Termux» → «Разрешения».
* Отозвать разрешение на хранение
* Предоставьте разрешение на хранение еще раз.
А на Android 12 Termux не способен в принципе нормально работать.
3. Установка ПО из менеджера пакетов
$ pkg list-all
#посмотреть стандартные пакеты в менеджере (альтернатива apt/dpkg). Портированных пакетов >1000, не заблудитесь.$ pkg update && pkg install python wget curl nano git tsu tor cronie grep htop printf
#установить необходимый минимум утилит, другие пакеты выбирать и ставить по мере необходимости.
У Termux имеется приятная особенность угадывания: если пользователь запускает какую-либо утилиту (в т.ч. с опечаткой), которая у него не установлена, но присутствует в репозитории, то юзер получает уведомление «угадывания» в терминале: что похожего имеется в репо и что пользователю нужно доставить, а проверить оно ли это ему требуется$ sqget
#ввод ошибочной команды$ pkg show «оно ли это»
#получить мета-информацию о пакете
sqget — пакета не существует и Termux пытается угадать, что пользователю требуется.
Пример решения проблем с обновлением/установкой пакетов.
Если пользователь Termux сталкивается с ошибкой при 'pkg update' обновлении пакетов из коробки (как повезёт), например из-за цензуры в стране, и/или из-за того, что Termux давно не обновлялся на устройстве пользователя (или того хуже имеется проблема с подписями: Termux ранее был установлен с GP и обновлён/переустановлен с F-droid); из-за компрометации ключей разработчиков, то удаление/установка Termux-приложения не поможет (обязательно нужно вычищать с устройства и все установленные termux-сервисы (termux api; termux boot; termux style), а так же очищать кэш и данные приложения перед удалением версии Termux GP). После же обычного удаления приложения часть данных остаётся на устройстве пользователя в таком случае проблем не избежать.
Первые три скриншота — описание проблемы обновлений Termux (в данном примере проблема обновлений пакетов навязана пользователю из-за internet censorship). Нижние 2 скриншота — решение: применение команды: «termux-change-repo». Данная команда предоставляет пользователю выбрать альтернативное зеркало репозитория: изменить источник обновления пакетов. Если с каким-либо репозиторием проблемы, то пользователь всегда может его заменить на дублёр с другого хостинга.
$ termux-change-repo
Выбрать получение обновлений (для всех репо, их может быть больше одного) с другого хостинга, которое не цензурируется вашим провайдером (на мой взгляд самое стабильное зеркало репозитория в РФ — это зеркало Termux/Github). Эта проблема и ее решение описана в документации, но как видите некоторые юзеры об этом и не догадываются и регулярно задают одни и те же одинаковые вопросы на профильных форумах (обычно такие пользователи вычисляются по количеству минусов над своим вопросом).
4. Кастомизация Termux (необязательно)
4.1. Стиль
Благодаря Fan-сообществу в Termux имеется множество готовых цветовых тем, а не только белый шрифт на чёрном фоне. Для выбора темы пользователю необходимо скачать с F-droid дополнение к Termux: Termux-Styling. После установки аддона при длительном нажатии на экран в области CLI появится пункт: more --> style. Можно выбирать/сменять из списка любую, приятную для глаз цветовую тему.
4.2. Настройка приветствия и приглашающей строки (необязательно)
На скриншоте приветствие и приглашающая строка Termux. Слева — настройки по умолчанию, справа — кастомные настройки пользователя.
Для настройки кастомной, приглашающей строки пользователю необходимо описать переменную «PS1» в файле домашнего каталога ~/.bashrc
Код:
$ nano ~/.bashrc -$ # ключ «-$» заставляет nano визуально переносить текст на новую строку
# Наполнение:
HISTSIZE=20000 #сохранять историю команд
HISTFILESIZE=1000 #размер истории в текущей сессии
export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S' #отображать дату введённой команды в истории (проверка даты --> $ history)
PS1="\[\033[1;34m\]┌──\[\033[0m\]\[\033[1;31m\]boss\[\033[0m\]\[\033[;34m\]──[\[\033[0m\]\[\033[1;35m\]\w\[\033[0m\]\[\033[;34m\]]\[\033[0m\]\n\[\033[1;34m\]└─❕\[\033[0m\]" #настройка переменной приглашающей строки как у автора.
export EDITOR=nano #сделать nano — редактором по умолчанию.
#«ctrl + o» сохранить; «ctrl + x» выход
$ bash
Для настройки приветствия пользователю необходимо отредактировать файл »/data/data/com.termux/files/usr/etc/motd»
Если у пользователя имеются рут-права, то редактирование файла «motd» из-за общего доступа очень простое, например, с помощью Total Commander + QuickEdit.
Если же рута нет, то$ nano ../usr/etc/motd
#две точки означают подняться на каталог выше из текущей директории.
Всё что пользователь набросает в «motd» каждый раз будет отображаться при запуске Termux. В моём случае с помощью утилиты figlet сгенерировал текст «Код Доступа Рай», добавив строкой ниже смайлики цветных кружков и всё это записал в файл «motd».
4.3. Настройка размера отображения вывода в CLI.
По умолчанию Termux отображает 2000 строк, что является невероятно низким значением рендеринга по отношению к мощностям гаджетов. Например, пользователь сильно ограничен при просмотре баз данных, словарей, работой с html/текстами и т.д. Что бы проще было понять проблему её нужно воспроизвести.
Код: $ seq 2100
#генерация числовых строк от 1…2100 и вывод их на печать. Попробуйте прокрутить CLI до самого верха и вы остановитесь на числе/строке 100 (всё что сгенерировано до числа 100 пользователь не увидит, а увидит строки чисел от 100…2100, вот оно ограничения в 2к строк).
В прошлом году я обратился к разработчикам Termux с предложением расширить ограничения терминала с 2к строк до 5–50к. строк. Проведя тесты, разработчики поддержали предложение и в Termux с v0.114+ доступна пользовательская настройка на рендеринг строк в termux-конфиге.
Код: $ nano -$ .termux/termux.properties
#конфиг, в котором настраиваются некоторые вещи: например, рендеринг строк, клавиши виртуальной клавиатуры, кликабельность ссылок в CLI.
Добавим строки:
terminal-transcript-rows=10000 #отображать в CLI 10к строк вместо 2к (доступно с v0.114+)
terminal-onclick-url-open=true #понимать url(s) в CLI (доступно с v0.118+).
Парсинг данных
«Лошадью ходи, лошадью!»
Однажды по пути в командировку мне на глаза попалась свежая chess-news: во время девятой, зимней, недавно завершившейся, партии за звание ЧМ по шахматам среди мужчин 2021 г. наш «декабрист» допустил грубейшую ошибку (на уровне «любителя»), повлиявшую и на окончательный итог турнира не в его пользу. Поискав в сети саму партию в чистом виде для импорта/анализа в шахматном движке на своём Android — столкнулся с проблемой: всякие, разные, шахматные сайты/базы требовали регистрацию/авторизацию что бы поработать с данными. Например, на одном таком, русскоязычном, шахматном сайте партия отображалась, но без аккаунта — скачать её было «невозможно». Расшарив ссылку на 9-партию, её все еще «невозможно» было скопипастить подручными средствами для анализа, самому же «играть в шахматы, угодя в цейтнот», против сайтов по их правилам я не спешил. Расставив черные и белые фигуры на доске кликнув по тёмно-белому значку Termux на рабочем столе и набрав несколько команд, черным по белому отобразился результат. Беспристрастно проанализировав партию в скором времени движок подытожил: «драма» за доской разыгралась в жарком декабре Дубая на 27 ходу.
Код: $ curl https://share.chessbase.com/SharedGames/game/?p=GGcui1RiwlsMXUUn49qJYW2loW1DrYRbproL+VX5mtFrtma1XhYxiFD4U+vvB+7P | grep "WCh 2021" -A 12
#чекаю ссылку с помощью curl, ищу данные партии, вывожу 12 строк (охват партии)
Результат — готовая партия для импорта/анализа:
Загружаю её в open source Android приложение droidfish и включаю анализ.
Погибельно-оборонительный за белых пассивный 27 ход: «пешка c5» вместо контратаки «конь с5/пешка f3» соответствует проигрышу лёгкой фигуры за белых, движок всё видит и отображает преимущество за чёрных в 3 единицы (1 = пешка, 3 = конь/слон. При прочих равных условиях МС должен обыграть гроссмейстера с преимуществом 1-й пешки в 9 из 10 случаев).
И забавная реакция чемпиона мира, против которого так «дерзко» было сыграно:
К слову, в Termux имеется возможность играть в шахматы прямо в CLI. Пакет для установки «gnuchess».
Код: $ pkg install gnuchess $ gnuchess
спойлер gnuchess
Музыкальный пауза
Являясь поклонником литературного аудио сериала Этногенез (ИМХО, одни из лучших аудиокниг в проекте — цикл про хакеров [1, 2]) намеревался получить всю коллекцию этногенез-музыки, а потом ещё и слушать её прямо в CLI. Сами саундтреки бесплатные и свободно доступны на официальном сайте для скачивания в разделе музыка.
82 музыкальных трека, из которых некоторые просто не качают не вау, а некоторые почему-то повторяются, тем не менее присутствует более насущная и техническая проблема: отсутствует возможность/кнопка «скачать весь проект». Классика: выбор композиции и скачивание по одному файлу, как по итогу — лишних восемьдесят пальцедвижений помноженное на прокрутку/выбор явно повлечёт за собой переутомление и потерю темпа.
Карманный CLI спешит на помощь…
Чтобы проверить с чем именно придется иметь дело, сurl-ом и grep-ом проверяю web-страницу проекта Этногенеза. Разметка страницы простая, набрасываю рабочий bash-код в одну строку для скачивания всех аудиотреков за один присест. Жизнь движение, ставлю «музыкальный поток» на автоскачивание и ухожу на тренировку.
Код:
#Создаю общедоступный каталог «этногенез», в который собираюсь загрузить все аудиотреки$ mkdir storage/shared/Download/этногенез
$ cd storage/shared/Download/этногенез
Curl-ом получаю html-страницы, grep-ом ищу все отношения к «mp3»$ curl http://www.etnogenez.ru/music/ | grep '
Исходя из проанализированных данных полный код на скачку музыки следующий: $ mkdir storage/shared/Download/этногенез $ cd storage/shared/Download/этногенез $ curl http://www.etnogenez.ru/music/ | grep '
Описание bash-кода.
Curl-ом получаю страницу; grep-ом ищу все отношения к ».mp3»; вижу, что все нужные данные по разделителю «пробел» находятся во втором «столбце», использую awk забирая 2-й столбец; с помощью sed восстанавливаю валидный префикс url-ов всех mp3-треков и отбрасываю кавычки; готовые url (s) саундтреков поочередно отправляются на вход утилите для скачивания wget.
Пошёл процесс скачивания всех 82 аудиотреков.
Однако, если пользователь не так причудлив чтобы искусно владеть bash-оболочкой, а может всё с точностью на оборот, то задачу с извлечением url (s)/mp3-треков со страницы можно повторить, например, на Python.
Код: $ pip install beautifulsoup4 html5lib
#создаем файл: «parsing_mp3.py»$ nano parsing_mp3.py
#Наполняем:
import requests
from bs4 import BeautifulSoup
r = requests.get("http://www.etnogenez.ru/music/").text
soup = BeautifulSoup(r, 'html.parser')
for link in soup.find_all('a'):
if ".mp3" in link.get('href'):
print(f"http://www.etnogenez.ru/{link.get('href')}")
Спарсим данные.$ python parsing_mp3.py > url && wget -i url
#с помощью python извлекаю с web-сайта все url (s) (относящиеся к mp3) и сохраняю в файл «url», с помощью wget закачиваю всё что указано в файле «url»
Пошла скачка всех тех же 82 аудиотреков по порядку, а в случае какой-либо ошибки/обрыва линии всегда можно докачать прерванное без излишнего кода.
Кроме того, с помощью wget (в случаях отсутствия ограничений) можно, например, выкачать весь сайт; отдельный web-каталог или спарсить все изображения, чем не может похвастать какое-либо Android приложение.
Код: $ wget -U="Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0" -r -k -p -E -nc url
#выкачать ресурс$ wget -U="Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0" -r -l=1 -nd -nc -A jpeg,jpg,bmp,gif,png url
#спарсить/выкачать все изображения, глубина рекурсии задается ключом -l=цифра
Автоматизация процесса: бэкап, шифрование данных с последующей синхронизацией в облако по расписанию
Rclone & 7-zip & crontab
Rclone
Данные, которые я постоянно выгружаю (вернее написать: данные которые автосинхронизируются) в облако со своего Android устройства — это зашифрованные бэкапы кэш/приложения.
Бэкап приложений и их данных по расписанию осуществляет приложение OandBackuPX/TB #требуется root
Остальная логика завязана на Termux.
Синхронизация/шифрование берёт на себя «rclone».
Автозапуск скрипта по расписанию осуществляется с помощью «cron» в Termux.
Установка и настройка rclone на примере Яндекс.Диска
Код: $ pkg install rclone $ rclone config
Настройка rclone простая: выбор в стиле POSIX: [y/n/enter/digit] ответив на вопросы (выбирать все действия рекомендую значениями по умолчанию).
Цифрами выбрать Yandex Disk (это может быть любая другая цифра в любой/обновленной версии ПО, например сегодня это цифра — 32). Откроется браузер. Ввести данные авторизации яндекс-аккаунта и вернуться в терминал, где автоподставится ключ. Облако настроено и готово к синхронизации в обе стороны, но такое положение вещей нас не устраивает, нам нужно защищать свои данные в любом случае (примечание — если пользователю не нужно шифровать данные, для последующей выгрузки на диск, то Я.Диск на этом шаге уже настроен и готов к работе).
Чтобы создать отдельный зашифрованный каталог в облаке, необходимо донастроить созданный ранее контейнер: обеспечить шифрование/дешифрование данных на лету.
Код: $ rclone config
#--> n --> вводим имя (сопоставление шифрованного каталога), если у меня ранее контейнер назывался «yad», этот я назову: yenc (первая буква облака, суффикс от сокращения «encrypt», стоить иметь ввиду на будущее, что короткие имена удобней использовать в этой утилите). Выбрать «Encrypt/Decrypt a remote» --> 10, далее ввести имя и шифрованный каталог (имя до двоеточия обязательно должно = имени создаваемого ранее контейнера: yad) yad: crypt выбрать режим шифрования, их 3 (в зависимости от работы в параноидальных условиях).
1. Encrypt the filenames see the docs for the details.
«standard»2. Very simple filename obfuscation.«obfuscate»3. Don’t encrypt the file names. Adds a ».bin» extension only.«off»
Использую 3-й вариант, который добавляет к шифрованным файлам лишь расширение ».bin» (остальные варианты обфусцируют имена файлов).
Далее, directory_name_encryption --> »2» (false), далее Password or pass phrase for encryption --> «y» (напечатать пароль, он не будет отображаться в CLI — это не баг, а стандартная защита), далее No leave this optional password blank --> «n», далее Edit advanced config? --> «n». После чего увидите свою конфигурацию (подтвердите её нажав «y»):
[yenc]
remote = yad: cryptfilename_encryption = offdirectory_name_encryption = falsepassword = *** ENCRYPTED ***
На сколько «сложным» бы не казался rclone его конфиг настройки простой, в затруднительном положении (выбирать все пункты по «default») в крайне затруднительном — RTFM.
Вот пара команд, которые нам потребуются «sync» и «copy».
Обратите внимание, чтобы получить зашифрованные данные с Я.Диска и расшифровать, их нужно указывать просто как «yenc:» (а не «yenc: crypt»)
$ rclone copy yenc: ~home/test
#скопирует/расшифрует все данные с облака в каталог test (если в папке «test» имелись какие-либо сторонние данные, с ними ничего не произойдет).$ rclone sync yenc: ~home/test
#аналогично, но уничтожит все сторонние данные в папке «test» (то есть полная синхронизация каталогов). Как всё просто. Да, так просто потерять всё. Пользователю необходимо соблюдать осторожность и внимательность, чтобы случайно не уничтожить сторонние данные. Например, ошибочный ввод: $ rclone sync yenc: ~home/
#уничтожит все пользовательские данные Termux, синхронизировав зашифрованный «crypt» каталог в облаке c «home» на гаджете нерадивого пользователя.
Синхронизация, но в обратную сторону (гаджет --> облако): $ rclone sunc источник :приемник/каталог
#полная синхронизация$ rclone copy источник :приемник/каталог
#синхронизация только выбранных данных
Существуют векторы атак, при которых пользовательская цитадель может не устоять (проблема хранения облачного пароля в открытом виде в конфигурации rclone). Плюсом rclone является то, что он легко настраивается для работы в параноидальных обстоятельствах (зашифровав конфиг/открытый пароль, но потребуется вводить каждый раз пароль разблокировки при синхронизации данных). Из минусов, бэкап-данные дублируются перед шифрованием в облако, излишне нагружая дисковое пространство на устройстве пользователя.
В rclone имеется второстепенно-полезная hash-функция, которая умеет проверять рекурсивно заданный хэш у файлов во всех подкаталагах без »| трубы» и циклов (алогичная утилита hashdeep).
#разница в том, что архив после сжатия будет переименован с новым дата-суффиксом:»13–02–2022_10ч_25 м_android.7z». Из плюсов, наглядно видно по имени файла: когда был сделан/обновлён бэкап. Из минусов, с таким именем возникнут сложности с автобэкапом; такие архивы множатся (вместо быстрой дозаписи одного единственного архива создаются новые копии).
Автовыполнение скриптов по расписанию
В Termux нет полноценной системы инициализации, но кое-что и кое-как работает и позволяет запускать скрипты на автомате:
A) при автозагрузке гаджета;
Б) либо запускать скрипты строго по расписанию, даже когда Termux не в трее.
Для выполнения скриптов при автозагрузке гаджета необходимо установить addon Termux boot, настроив простой boot-конфиг. Для другой задачи: автовыполнение скриптов по расписанию у Termux в репозитории имеется пакет «cronie» (местный crontab), который нужно установить и немного подкрутить по причине того, что подчёркнуто выше.
Код: $ pkg install cronie termux-services
# ребут Termux$ sv-enable crond
#достаточно этот шаг сделать один раз и пользователь в деле$ crontab -e
#настроить выполнение скриптов по расписанию по классике. Например, в исполняемом «скрипт.sh» первой строкой достаточно указать сокращенный путь:»#!/bin/bash» и не забывайте про раздачу прав: «chmod +x скрипт.sh»
# быстрая проверка, работает ли «демон»$ pidof crond
Пользователям с агрессивным энергосбережением стоит добавить все приложения Termux в исключение: «ограничения работы в фоновом режиме» в настройках своего Android.
Быстрый check автоматизации процесса
Код: $ nano -$ срипт.sh
#Наполнение скрипта
#!bin/bash
mkdir storage/downloads/Habr #создать пустой каталог в общедоступном месте
$ chmod + x срипт.sh
#разрешаем выполнение скрипта$ crontab -e
#создаём задание: каждую минуту автоматически создавать папку «Сodeby» в общедоступном каталоге «Downloads»*/1 * * * * bash /data/data/com.termux/files/home/скрипт.sh
#«ctrl + o» сохранить; «ctrl + x» выход из nano; «ctrl + d выход из Termux»
Любым файловым менеджером проверяем общедоступный каталог «Downloads» и ищем папку «Habr», удаляем её, но в течение минуты она снова появится, что сигнализирует о том, что скрипт работает на автомате, а значит можно приступать к написанию сценариев реальных задач.
Если пользователь не скачивал termux-boot, если у пользователя агрессивное энергосбережение, то в шторке Android/Termux есть функция «wakelock» (пытаться запрещать переходить гаджету в глубокий сон).
Бэкап Termux
В лучшем случае будет обидно установить и настроить Termux/пакеты под себя, но при развёртывании копи на другом устройстве и/или при любом инциденте потерпеть фиаско.
Проверка сколько места занимает настроенная Termux-среда.
Код: $ cd ../../ && du -sh
#подняться на два каталога выше и измерить пользовательские и системные пакеты Termux
>>>4.1G
$ pkg list-install | wc -l
#количество установленных пакетов
>>> 307
Если у пользователя отсутствуют root-права, то авто/бэкап всей среды делается по мануалу.
Программирование на Android
Уметь ловко писать сценарии на bash хороший навык, но ограниченный. В Termux репозитории имеются пакеты языков программирования (ЯП), например, python, php, perl, ruby, а так же scala, elixir, java, go, rust, brainfuck. Давайте напишем нашу однофункциональную программу на всех вышеперечисленных языках, которая поприветствует пользователей Хабра.
Код: $ pkg install python golang elixir php rust perl ruby scala brainfuck
#установка ЯП, bash/java уже предустановленные среды.
Пруфы. Успешное выполнение программ на всех вышеперечисленных ЯП.
Хорошие новости: можно обучаться и практиковать/поддерживать навыки владения ЯП прямо с гаджета, например, проходя курсы программирования по Python на Stepik, решая задачи где бы ты не находился.
В реальности же имеются технические ограничения. Например, на Python «нельзя» писать и запускать ПО, требующего многопроцессорного параллельного вычисления напрямую в Termux (параллельные вычисления на нескольких ядрах CPU, не путать с многопоточностью (и не касается, например СИ-программ)). Скрипты, которые размашисто потребляют ОЗУ, несмотря на избыточно-свободную память могут аномально снижать скорость вплоть до замирания. Простой пример воспроизведения проблемы на Python с распараллеливанием кода на CPU (s).
Код: $ python
import concurrent.futures as pool
e = pool.ProcessPoolExecutor(max_workers=2, mp_context=None, initializer=None, initargs=())
#Приведёт к следующей ошибке:
#>>>raise ImportError("This platform lacks a functioning sem_open" + ImportError:
#This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.
По той же причине не встанет, например, и библиотека NumPy и импортирующее её ПО: $ pip install numpy
#установка не завершится и приведёт к ошибке
Но если очень надо…
Вмешаемся в сам интерпретатор Python, заменив многопроцессорные параллельные вычисления на многопоточные.
Код: $ nano ../usr/lib/python3.10/multiprocessing/synchronize.py
заменяем ~28 строку:
from _multiprocessing import SemLock, sem_unlink
на
from threading import Lock
В таком случае можно запускать параллельные вычисления в потоках, а не процессах.
Пруф, библиотека numpy установлена и работает!
Proot-distro
Компромисс. Если пользователь располагает достаточно свободным дисковым пространством (±10 Гб) на своем гаджете, то он может установить в Termux один из дистрибутивов GNU/Linux (например, termux-ubuntu и п.д.).
И запускать не только скрипты, требующие распараллеливания кода на CPU (s), но и юзать GUI-софт, например, Gimp.
Proot-distro, метафорично выражаясь — это сила Temux и ни NetHunter-у и ни Andrax далеко им всем сейчас. Вся Termux-стихия заключена в 4-х строчках ниже, но обойдя одни ограничения, обязательно натыкаешься на другие (overkill abstractions).
Код: $ pkg install proot-distro $ proot-distro list $ proot-distro install ubuntu $ proot-distro login ubuntu
Сравнение пакетов
mutt & smtplib
Для работы с электропочтой в Termux имеется пакет: mutt
Код: $ pkg install mutt
$ nano ../usr/etc/Muttrc
#редактирование конфига в CLI/nano для тех у кого не рут прав$ mutt
#запуск
Скриншот: входящие письма на Яндекс почте.
Работа с email требуется, например тогда, когда произошло какое-либо событие, и в случае успеха или ошибки автоматическая отправка репорта на email. Я не могу похвалить или раскритиковать mutt не предвзято т.к. пользуюсь в подобных скрипто-делах Python с библиотекой smtplib, которая работает стабильно и без нареканий.
Сравнение пакетов: html2tetx* vs links
А вот пример, когда сторонний софт перспективнее местного. В Termux имеется в наличии пакет «html2text», который позволяет выводить очищенные от тегов web-страницы в CLI. У данного пакета имеются нюансы с автовыбором кодировки: например, русскоязычные символы отображаются кракозяброй и на мой взгляд не самое лучшее форматирование текста. В Python имеется альтернативный пакет с тем же названием и аналогичным функционалом, но ИМХО, разработкой на порядок выше. Сравним эти два пакета от разных разработчиков написанных на разных языках, но выполняющих одну и ту же функцию (примечание — html2text популярные утилиты и представлены на многих ЯП, не только на Python и Perl).
Код: $ pkg install html2text
#установка из репозитория Termux
# тесты$ pip install html2text
#установка из репозитория (каталог ПО Python)
# тесты
Запуск разных html2text-пакетов на примере обработки одной и той же русскоязычной статьи: $ curl https://habr.com/en/post/488432/ | html2text
Выхлоп утилит на одной и той же статье: слева — пакет html2text из репозитория Termux, справа — python пакет html2text. В данном случае наблюдаем, что python-пакет по умолчанию верно определяет кодировку, а для нормального отображения русскоязычного текста при работе с пакетом из репозитория Termux необходимо явно указывать флаг кодировки, например,»-from_encoding windows-1251»;»-from_encoding utf-8».
Альтернативный, возможно даже более удобный, способ получить текстовую версию web-страницы очищенную от тегов — это использовать cli-браузер, например, links.
Код: $ pkg install links $ links # «g» открыть url --> файл --> Сохранить форм. документ
CLI-браузер links.
Пре