Код Доступа Termux

Статья посвящается любителям CLI в знак солидарности лучшего терминала на OS Android, который испытывает «кошмарную» монополию Google.

Эта диаграмма создана в TermuxЭта диаграмма создана в 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 пытается угадать, что пользователю требуется.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 (в данном примере проблема обновлений пакетов навязана пользователю из-за 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. Слева — настройки по умолчанию, справа — кастомные настройки пользователя.На скриншоте приветствие и приглашающая строка 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 случаев).Погибельно-оборонительный за белых пассивный 27 ход: «пешка c5» вместо контратаки «конь с5/пешка f3» соответствует проигрышу лёгкой фигуры за белых, движок всё видит и отображает преимущество за чёрных в 3 единицы (1 = пешка, 3 = конь/слон. При прочих равных условиях МС должен обыграть гроссмейстера с преимуществом 1-й пешки в 9 из 10 случаев).

И забавная реакция чемпиона мира, против которого так «дерзко» было сыграно:

К слову, в Termux имеется возможность играть в шахматы прямо в CLI. Пакет для установки «gnuchess».

Код:
$ pkg install gnuchess $ gnuchess

спойлер gnuchess

Тяжёлая боевая ничья на 45 ходу в ходе троекратного повторения позиции. Gnuchess не единственная логическая cli-игра в Termux, под гейм-пакеты выделен целый репозиторий.Тяжёлая боевая ничья на 45 ходу в ходе троекратного повторения позиции. Gnuchess не единственная логическая cli-игра в Termux, под гейм-пакеты выделен целый репозиторий.

Музыкальный пауза

Являясь поклонником литературного аудио сериала Этногенез (ИМХО, одни из лучших аудиокниг в проекте — цикл про хакеров [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 аудиотреков.Пошёл процесс скачивания всех 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 аудиотреков по порядку, а в случае какой-либо ошибки/обрыва линии всегда можно докачать прерванное без излишнего кода.Пошла скачка всех тех же 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).

Скриншот Rclone --> Я.Диск.» />Скриншот Rclone --> Я.Диск.</p>

<p><strong>7-zip</strong></p>

<p>Если пользователь не желает шифровать данные в облаке с помощью rclone, например, если он находится в обстоятельствах, где нет возможности быстро развернуть rclone <em>(а настроить/установить его нет времени)</em>, а данные нужно получить в расшифрованном виде как можно скорее, то на помощь приходит криптостойкий/кроссплатформенный архиватор »7-zip».</p>

<p>Код: <br /><code>$ pkg install p7zip $ cd storage/shared/Download $ 7z u test.7z -pCodeby -mx9 'test'</code> #ключ «u» сообщает, что в архив добавлять/создавать только новые/обновлённые файлы; пароль «Codeby» <em>(шифрование криптостойкое, т.е хэш из разряда медленных, придерживаясь парольной доктрины хэш не растрескать)</em>; «mx9» максимальное сжатие; архивирование каталога «test». Эта команда удобна, если пользователь настроил автобэкап архива «test.7z» в облако.</p>

<p>В ином случае <em>(ручной бэкап архивов в облако).</em><br />Код: <br /><code>$ 7z u test.7z -pCodeby -mx9 'test' && mv 'test.7z' $(date + #разница в том, что архив после сжатия будет переименован с новым дата-суффиксом:»13–02–2022_10ч_25 м_android.7z». Из плюсов, наглядно видно по имени файла: когда был сделан/обновлён бэкап. Из минусов, с таким именем возникнут сложности с автобэкапом; такие архивы множатся (вместо быстрой дозаписи одного единственного архива создаются новые копии).

7a123ad42cdd8801851782ad74d30a40.png

Автовыполнение скриптов по расписанию

В 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 установлена и работает!Пруф, библиотека 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».Выхлоп утилит на одной и той же статье: слева — пакет 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.CLI-браузер links.

Пре

© Habrahabr.ru