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

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

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

Оглавление:
Установка и настройка
Подключение по SSH
Настройка горячих клавиш и клавиатуры
Доступ к внешней памяти устройства
Дополнения Termux
Дополнение Termux:API
Дополнение Termux:Widget
Интерпретаторы скриптов
Выполнение скриптов из сторонних приложений
Запуск приложений из Termux
Дополнительно

Источники:
Basic use of termux (sqlsec.com) – огромная статья с обзором установки и настройки среды, множества пакетов, описанием API-команд, горячих клавиш (осторожно, китайский! есть eng-версия на fatalerros.org)
Android+Termux – карманный друг хакера (codeby.net) – хороший обзор, подключение по ssh с компа
Правильный Git-клиент на Android (pedronveloso.com) – (en) хорошая статья о Termux и git с помощью него


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

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-wake-lock – использовать блокировку Termux, чтобы процессор не засыпал
termux-wake-unlock  – убрать блокировку Termux, чтобы процессор мог засыпать

Т.к. оболочка входа по-умолчанию – bash, то при использовании одного сеанса можно автоматизировать включение/отключение блокировки так:
1) добавить вызов termux-wake-lock в файл ~/.profile (или ~/.bash_profile)
2) добавить вызов  termux-wake-unlock в файл ~/.bash_logout

Для нескольких сеансов придется самостоятельно управлять вызовом разблокировки. Но есть возможность вызвать bash один раз и использовать byobu для запуска нескольких сеансов bash в рамках одного сеанса Termux.

Примечание:

По моим наблюдениям (на устройстве Redmi 4x), если не использовать команду termux-wake-lock, то при выполнении заданий в фоне с помощью termux-job-scheduler, когда телефон “спит”:

  • период времени запуска заданий может варьироваться. Например, вместо 30 минут может быть 30-35 минут. Но, тем не менее, задания все равно запускаются.
  • команды могут выполняться на порядок дольше. Например, команды git – несколько минут вместо нескольки секунд. В связи с чем, при запуске команды git commit, даже когда нечего коммитить, может возникнуть сообщение:
    It took 3.24 seconds to enumerate untracked files. 'status -uno'
    may speed it up, but you have to be careful not to forget to add
    new files yourself (see 'git help status').
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-dialog widget [options] – отображение диалога Dialog с элементами управления. Результат выбора возвращается в формате json

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

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-job-scheduler. Хотя, сообщение termux-toast выводится без проблем. При этом , доп.разрешения на отображение окон в фоне установлены.

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"


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

Как оказалось, 20.09.2020 раздел FAQ с вопросом “How to run Termux commands from other application?был обновлен. Этот вопрос был решен точь в точь как мне и было нужно, но я об этом не знал.

Как было раньше: (развернуть)

К сожалению, выполнить пользовательский 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.

На данный момент, с помощью сервиса RunCommandService из своего приложения можно отправлять намерения ( Intent) в среду Termux для выполнения необходимых команд.

Требования:

1) В конфиг-файле ~/.termux/termux.properties параметр allow-external-apps должен быть установлен в true :

Перезагрузить настройки:

2) В манифесте вашего приложения должно быть объявлено разрешение (permission) com.termux.permission.RUN_COMMAND:

3) Чтобы автоматически запускать и выводить на передний план команды Termux, которые были запущены с параметром “background mode = false” в android >= 10 без необходимости вручную щелкать уведомление, нужно, чтобы Termux получил разрешение на “показ всплывающих окон, когда запущено в фоновом режиме”. Это также относится и к плагину Termux:Tasker.

Например:
Сведения о приложении -> Другие разрешения -> Отображать всплывающие окна, когда запущено в фоновом режиме

4) Чтобы еще больше снизить вероятность того, что Termux будет убит операционной системой в связи с невозможностью вызвать startForeground() в течение ~5 секунд после запуска службы на Android >= 8, следует отключить оптимизацию батареи для Termux.

Например:
Сведения о приложении -> Контроль активности -> Нет ограничений

5) Значения (extras) для передачи в Intent:

extras

Тип

Обязательный

Описание

String

Да

Путь к команде или скрипту.

Может использоваться абсолютный путь с префиксом “$PREFIX/” or “~/”.

String array

Нет

Параметры команды/скрипта

String

Нет

Рабочий каталог, который будет установлен при запуске команды/скрипта (не обязательный параметр).

Может использоваться абсолютный путь с префиксом “$PREFIX/” or “~/”.

boolean

Нет

Признак того, нужно ли запускать команду/скрипт в фоновом режиме.

По-умолчанию – false.

Пример отправки команды в Termux:

Остальные способы запуска скриптов Termux:

  • непосредственно из терминала
  • с помощью 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 будет ошибка:

netstat: no support for `AF INET (tcp)' on this system.

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

3 thoughts on “Termux – Linux-терминал в Android

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

Ваш адрес email не будет опубликован.