Termux – Linux-терминал в Android

Termux – приложение с открытым исходным кодом, реализующее Linux-подобную среду, взаимодействие с которой происходит посредством консоли без необходимости иметь root-права на устройстве. Доступно для устройств с Android >= 7 (раньше было 5).

Termux бесплатен. Имеет несколько дополнительных модулей (см.ниже), которые можно купить  на Google Play, свободно скачать на F-Droid или самостоятельно собрать из исходников на github. При этом, нельзя смешивать установку приложения, скачанного, например, на Google Play с установкой модуля, скачанного на F-Droid, т.к. они будут несовместимы из-за разных ключей подписи, используемых при сборке (сам не проверял).


Установка и настройка

1) Установить из Google Play или F-Droid

2) Обновить внутренние пакеты

3) При необходимости, настроить ssh-сервер и подключиться удаленно к оболочке Termux с компьютера (подробнее ниже, а также в статье)

3) При необходимости, настроить панель горячих клавиш и клавиатуру (подробнее ниже)

4) Открыть доступ к внешнему хранилищу устройства (подробнее ниже)

5) При необходимости, установить пакет для поддержки команд Termux API (подробнее ниже):

$ pkg install termux-api 

6) При необходимости запуска скриптов с помощью дополнения Termux Widget, создать специальные каталоги в домашней директории $HOME и скопировать туда скрипты (подробнее ниже).

7) При необходимости, установить и настроить git с использованием парольной аутентификации к удаленному репозиторию или с помощью ssh-ключей (описание в статье).


Подключение к Termux по ssh

Для подключения к оболочке Termux с компьютера (хоста) по протоколу ssh, нужно установить пакет OpenSSH:

Запуск ssh-сервера осуществляется командой sshd, после чего на порту 8022 открывается порт для подключения.

Проверить работу ssh-сервера на нужном порту можно командой netstat:

Должны быть выведены 2 строки с надписью LISTEN.

Termux не поддерживает парольную аутентификацию по SSH и поэтому нужно будет использовать SSH-ключи. Более подробно про ssh-ключи и их использование написано в статье Работа с ssh-ключами.

Если имеющихся ssh-ключей хостовой машины нет, то их нужно создать. На Linux это делается с помощью команды ssh-keygen, на Windows с помощью программ BitVise-SSH или PuTTYgen.

Публичный ключ (по-умолчанию называется id_rsa.pub) нужно будет загрузить на телефон и скопировать в файл ~/.ssh/authorized_keys.

Например, подключаем телефон к хостовой машине как дисковый накопитель, копируем файл публичного ключа в корень памяти телефона. Затем в Termux выполняем команду:

Команда добавляет содержимое файла id_rsa.pub в файл authorized_keys.

Файл публичного ключа уже не нужен, удаляем:

Далее подключаем телефон к сети Wi-fi, узнаем его IP и подключаемся к нему с помощью SSH-клиента. С этого момента работа в Termux с клавиатуры компьютера становится намного удобнее.


Настройка горячих клавиш и клавиатуры

Панель горячих клавиш и клавиатуры можно настроить (FAQ: Touch Keyboard).

Редактирование панели с кнопками (создать файл при отсутствии):

Применить изменения:

Для себя настроил вот такие кнопки:

Отображается так:

Можно настроить многострочное отображение панели (но оказалось неудобно, строчки узкие).

Клавиши, не попавшие в панель, можно вызвать с помощью комбинаций клавиш Up,Down и букв на клавиатуре (не уверен, что все).


Доступ к внешней памяти устройства

Чтобы запросить для Termux доступ к внешнему хранилищу телефона, нужно выполнить команду:

При этом запросится разрешение WRITE_EXTERNAL_STORAGE.

После этого в домашнем каталоге $HOME ( ~ или /data/data/com.termux/files/home) появится каталог storage, где будут содержаться симлинки на реальные каталоги внешнего хранилища:

  • shared – root внешнего хранилища
  • downloads
  • dcim
  • pictures
  • music
  • movies
  • external-1 – приватные данные Termux на внешнем хранилище. При удалении Termux эти данные также удалятся.

Если этого не сделать, то оболочке будет доступен только приватный для приложения участок памяти  /data/data/com.termux/files, который недоступен любому файловому менеджеру, если у вас нет root прав на устройстве.


Дополнения

API – набор специальных команд для расширения функциональности устройства (подробнее ниже).

Boot – запуск скриптов при запуске устройства

Float – запуск Termux во всплывающем окне поверх других окон

Styling – настройка цветовой схемы и шрифта в терминале Termux

Tasker – запуск скриптов Termux из заданий Tasker‘а

Widget – виджет на рабочем столе для запуска скриптов Termux (подробнее ниже)


Дополнение Termux:API

Дополнение API – расширение функциональности устройства с помощью вызова специальных команд в Termux.

Для запуска команд нужно установить пакет termux-api:

Некоторые интересные команды:

$ termux-dialog widget [options] – отображение диалога Dialog с элементами управления. Результат выбора возвращается в формате json

Параметры:
    widget  – вид вьюшки: confirm/ checkbox/ counter /date /radio /sheet/ spinner /speech /text /time
    -l, list  – отобразить список вьюшек и их параметров
    -t, title  – заголовок диалога (не обязательно)

$ termux-job-scheduler [options] – выполнение скрипта по расписанию (документации почему-то нет, ссылка на исходник)

Некоторые параметры:
    -s, --script path  – путь к скрипту. Скрипт должен находиться в каталоге $HOME, т.к. только там файлам можно предоставить право выполнения (x).
    --job-id id  – id задания. Будет переопределено любое задание, имеющее такой же id.
    --period-ms msec  – периодичность выполнения скрипта. По-умолчанию 0 – выполнить 1 раз. Начиная с Android 7 минимальный период = 900,000ms (15 минут).

Пример:

Ошибка: Cannot execute file: ...
Причина: У файла не задано право на выполнение (x).

Примечание:
Файлам во внешней памяти нельзя предоставить право на выполнение. Только в каталоге $HOME.

$ termux-notification [options] – отображение уведомления с вызовом скрипта при его нажатии

Некоторые параметры:
    -i/--id id  – id уведомления (будет переопределено любое предыдущее уведомление с таким же id)
    -t/--title title  – заголовок уведомления
    --action action  – действие для выполнения при нажатии на уведомление. Это может быть команда, несколько команд, разделенных через “;” или файл скрипта с правами на выполнение
    --help-actions  – документация по действиям, указываемым в параметре --action 
     --on-delete action  – действие для выполнения при удалении уведомления из шторки
    --priority prio  – приоритет (high/low/max/min/default)
    --vibrate pattern  – паттерн вибрации (список значений через запятую: 500,1000,200)
    --sound  – включить звук уведомления

Пример:

$ termux-toast [options] [text] – отображение уведомления Toast


Дополнение Termux:Widget

С помощью дополнения Termux:Widget на рабочий стол устройства можно добавить виджет со списком bash-скриптов для их быстрого запуска.

Пример виджета:

При этом, скрипты могут быть запущены двумя способами:

а) в терминале Termux. Т.е. при запуске скрипта будет открыто окно терминала Termux, в котором  и будет происходить выполнение скрипта.

В этом случае скрипты нужно положить в специальный каталог .shortcuts в домашнем каталоге.

Создание каталога:

б) в фоне. Т.е. скрипт будет выполнятся “сам по себе”, без окна терминала Termux.

Для запуска фоновых скриптов их нужно поместить в подкаталог  .shortcuts/tasks домашнего каталога.

Примечание:

Если скрипт запускается в фоне, и открытает какие-либо визуальные окна (например, запускает другое приложение), то в системе Android (начиная, примерно, с версии 7) приложению Termux нужно добавить соответствующее разрешение. Например, в Android 9: Свойства приложения (О приложении) -> Другие разрешения -> Отображать всплывающие окна, когда запущено в фоновом режиме. Иначе ничего не отобразится.

Я храню сами файлы скриптов во внешней памяти устройства, а не в приватном участке памяти для приложения (например, каталог $HOME, или  /data/data/com.termux/files/home). Т.к., если приложение Termux будет удалено, то его приватный каталог тоже очистится.

Для этого, с помощью команды ln, на сами файлы скриптов можно создать символьные ссылки (симлинки), которые положить в каталог  .shortcuts:

$ ln -s $HOME/storage/shared/real_path_to_scripts/script.sh $HOME/.shotcuts/script.sh 

Также, не забудьте сделать исходный файл скрипта исполняемым:


Интерпретаторы скриптов

Чтобы работали скрипты с интерпретаторами (т.н. shebangs), к примеру, типа #!/bin/sh или #!/usr/bin/env python, нужен termux-exec, который устанавливается как зависимость apt  (при apt версии >= 1.4.8-1). Если termux-exec вдруг не установлен, нужно запустить pkg upgrade  и перезапустить Termux.

Если скрипты с такими интерпретаторами, как #!/bin/sh , не запускаются, даже если установлен termux-exec, попробуйте сбросить переменную среды LD_PRELOAD:

и перезапустите сеанс Termux.

Также, исправить обращение к интерпретаторам можно “вручную” с помощью команды termux-fix-shebang.

Она заменяет путь к интерпретатору /bin на /data/data/com.termux/files/usr/bin  (сокращенно $PREFIX/bin) в самих файлах скриптов. Но это устаревший способ.

Например:

А вообще, при проблемах в скриптах с путями к интерпретаторам возникает ошибка:

"Bad Interpreter: No such file or directory"


Выполнение скриптов из сторонних приложений

К сожалению, выполнить пользовательский bash-скрипт Termux “напрямую” из сторонних приложений (например, с помощью того же механизма передачи Intent) нельзя. Это связано с тем, что в Termux (пока?) не реализован контроль доступа для каждого приложения, а у пользователей Termux, например, в домашнем каталоге может храниться конфиденциальная информация (к примеру, ключи SSH).

Вот цитата из их FAQ:

How to run Termux commands from other application?

This is not supported currently.

That feature will not be implemented until Termux will have a solution for at least per-app access control.

Many users use it for accessing remote services and this requiring to store SSH keys, API tokens and other sensitive information in $HOME. Termux obviously do not have privilege separation and we need to somehow protect user’s data from third party eyes.

Для себя нашел 3 варианта запуска скриптов:

  • непосредственно из терминала
  • с помощью Termux:Widget
  • из заданий Tasker‘а или Automate

Запуск приложений

Для запуска приложений можно использовать Activity Manager:

Например, для запуска MyTetroid это будет:


Дополнительно

Внутри bash-скриптов нельзя использовать пути к файлам из самой оболочки Termux (например, ~/storage/shared). Нужно использовать стандартные пути Android (например, /storage/emulated/0).

Пакет pkg – менеджер пакетов
Команды:

upgrade  – обновление всех установленных пакетов до последней версии
install <package>  – установка пакета
uninstall <package>  – удаление пакета
reinstall <package>  – переустановка пакета
files <package>  – список всех файлов, установленных вместе с пакетом
show <package>  – отображение основной информации о пакете, например, зависимости
search <query>  – поиск пакета по части имени или описания
list-installed  – список всех установленных пакетов
list-all  – список всех доступных пакетов в репозиториях
autoclean  – удаление всех устаревших пакетов из кэша .deb-файлов пакетов
clean  – удаление всех пакетов из кэша .deb-файлов пакетов

Пакет htop – мониторинг запущенных из Termux процессов.
Установка:

Если экран устройства небольшой, то последний столбец “Command” с именем процессов не поместится (придется уменьшать масштаб всего изображения). Но можно воспользоваться настройками отображения данных (F2) и удалить лишние столбцы.

Пакет tsu (Termux SU) – для работы от рута. По-умолчанию Termux запускаеться под обычным юзером.
Установка:

Запуск:

Начиная с Android 10, при запуске команды netstat -tunlp будет ошибка:

Причину подсмотрел здесь: с версии Android 10 утилиты больше не могут получать статистику из интерфейсов в /proc/net/. Обходного пути нет, хотя определенную информацию, связанную с IP, можно получить с помощью /system/bin/ip.

0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *