Termux шаг за шагом (Часть 2)
В прошлой части мы с вами познакомились с базовыми командами Termux’а, настроили SSH соединение с ПК, научились создавать alias’ы и установили несколько полезных утилит. В этот раз нам предстоит шагнуть еще дальше, мы с вами:
- узнаем про Termux:API
- установим Python и nano, а также напишем «Hello, world!» на Python
- узнаем про bash-скрипты, и напишем скрипт с использованием Termux:API
- используя bash-скрипт, Termux:API и Python напишем простую программку
Поскольку мы теперь понимаем, что делают вводимые команды, то со следующего шага я не буду так подробно расписывать каждое действие, но там где могут быть затруднения, пояснять буду обязательно.
Я часто применяю alias’ы, поэтому используемые в этой части сокращения показаны здесь:
alias updg='apt update && apt upgrade' alias py='python'
План готов, можно приступать! И конечно же не забывайте про «волшебный Tab» (См. Часть 1).
Шаг 4
Погружаемся в кроличью нору Termux:API
API как много в этом слове для сердца кодера слилось
Если не затрагивать тему Termux:API, то все наши шаги можно было свести к простому пересказу какой-нибудь брошюры типа «Линукс для чайников», как было справедливо подмечено в комментариях к первой части.
Для начала установим Termux:API из Google Play Market’а (после не помешает перезапустить Termux):

Далее нам нужно установить пакет API в консоли Termux’а:
updg # Не забываем про alias’ы apt install termux-api
Для экспериментов я использую Android 5.1.1, для владельцев Android 7 нужно «защитить» Termux: API, зайдя в ‘Настройки’ > ‘Защищенные приложения’, в противном случае вызовы API, такие как termux-battery-status , будут зависать. (См. wiki проекта)
Теперь стоит поближе познакомится с приобретенными возможностями. Самое свежее и подробное описание Termux:API можно найти на wiki проекта. Я же постараюсь выбрать самое наглядное и интересное, что позволит набить руку для самостоятельной работы в дальнейшем.
Несколько примеров Termux:API
-
termux-battery-status
Возвращает состояние батареи

termux-brightness
Устанавливает яркость экрана от 0 до 255

termux-toast
Показывает временное всплывающее уведомление

termux-torch
Включает фонарик

termux-wifi-scaninfo
Возвращает информацию о последнем сканировании сетей Wi-Fi
Нетрудно заметить, что возвращаемые значения являются строками, словарями, списками словарей, в общем типами данных, с которыми прекрасно работает Python, поэтому следующим шагом мы его установим.
Шаг 5
Установим Python и nano
Для установки Python’а пишем в терминале:
updg apt install python apt install python2
Теперь у нас установлен 2 и 3 Python.
За время работы над статьей, я открыл для себя еще один текстовый редактор nano, который приглянулся мне больше чем vim, давайте его установим:
apt install nano
Пользоваться им проще чем vim’ом, и nano имеет более дружественный интерфейс. На Android устройстве все же удобнее vim.
HelloWorld на Python в Termux
По большому счету можно было обойтись и без этого пункта, но поставить Python в Termux и не написать HelloWorld, на мой взгляд, моветон.
Я не ставлю своей целью учить кого-либо Python’у, так что не знающие могут просто скопировать код (или начать изучать самостоятельно, благо литературы хватает), а знающие могут и сами что-нибудь наваять. А я «под шумок» еще покажу способ вводить текст в терминале без редактора.
cat >hello-world.py # Если не указывать источник (напоминаю cat 1.txt > 2.txt) # то cat будет брать данные из стандартного потока ввода, # проще говоря вводимое с клавиатуры. str = ‘Hello, world!’ # присваиваем переменной str значение "Hello, world!" print (str) # выводим на экран значение из переменной str # Ctrl + D закончить ввод и записать файл (hello-world.py) py hello-world.py # запускаем файл (py это alias от python)

Если в процессе ввода вы не заметили ошибку и уже нажали Enter, то перейти на строку выше не получится, для этого закончите ввод нажав Ctrl + D (можно вообще прервать Ctrl + Z) и повторите все с начала. Поскольку мы использовали ‘>’ то файл будет переписан полностью. По этой причине не рекомендую использовать такой метод ввода, если вы не уверены что напишете код сразу без ошибок.
Шаг 6
Bash-скрипты
Bash-скрипты это замечательный способ автоматизации работы с терминалом. Скрипт представляет из себя файл с расширением .sh (расширение не обязательно) содержащий набор команд терминала часть из которых мы уже изучили. Вот список большинства команд, все должно работать, но обратите внимание, что это список для «взрослого» Linux’а, а не для Termux’а, а вот просто шикарный материал по bash-скриптам.
При помощи скриптов можно автоматизировать практически все монотонные действия. Напишем простейший bash-скрипт выводящий значение из созданной им же переменной, я снова воспользуюсь cat’ом, вы же можете использовать нормальный текстовый редактор, а особо желающие себя потренировать могут использовать echo.
cat >test.sh export str="Привет, Хабр!" # Создаем переменную str # и присваиваем ей значение "Привет, Хабр!" # Не ставьте пробелы до и после ‘=’ # export сделает переменную доступной вне скрипта (т.е. можно без него) echo $str # Для обращения к переменным перед ними ставится ‘$’ # Ctrl + D # ./test.sh для запуска скрипта, но если это сделать сейчас то будет ошибка # для избавления от ошибки нужно сделать файл test.sh исполняемым chmod +x test.sh # chmod изменяет права доступа (+ добавить / - убрать) # ‘+x’ означает что мы делаем файл исполняемым ./test.sh # Запускаем выполнение нашего скрипта

Один добрый человек справедливо заметил, что команда export лишняя если переменная используется в рамках одного скрипта, так как вынесет переменную в окружение, то есть сделает ее доступной вне скрипта, занимая лишнюю память. Таким образом после выполнения test.sh мы сможем обращаться к переменной $str из командной строки.
Bash-скрипт с Termux:API
Давайте напишем уже что-нибудь отличающееся от пресловутых HelloWorld’ов, но столь же бесполезное. Наш скрипт будет:
- выполнять запрос API termux-battery-status
- сохранять полученные данные в файл test.txt
- выводить данные из файла на экран
- выполнять написанную ранее программу hello-world.py
- полученные от программы данные записывать в файл test.txt
- выводить данные из файла на экран
- переносить данные из файла в буфер обмена
- выводить на экран содержимое буфера обмена
- выводить всплывающее сообщение с данными из буфера обмена
Сначала создадим папку для работы и скопируем туда hello-world.py как test.py, создадим в этой папке файлы test.sh и test.txt:
mkdir bashscript cat hello-world.py >> bashscript/test.py cd bashscript/ touch test.sh test.txt # touch создает файлы chmod +x test.sh
Теперь любым удобным способом в файл test.sh запишем скрипт:
#!/bin/bash # В начале каждого скрипта принято ставить #! (называется шебанг) # после идет указание на шелл для которой написан скрипт clear # очистим окно терминала termux-battery-status > test.txt # пункты 1 и 2 из намеченного функционала cat test.txt # пункт 3 python test.py > test.txt # пункт 4 и 5 cat test.txt # пункт 6 cat test.txt | termux-clipboard-set # пункт 7 # | это конвейер. переносит данные с выхода одного потока на вход другого termux-clipboard-get # пункт 8 termux-clipboard-get | termux-toast # пункт 9
Теперь находясь в папке bashscript пишем ./test.sh наблюдаем в терминале на Android устройстве:

Вот мы и написали запланированный bash-скрипт. Можно разбавить его выводом в консоль информации по выполнению каждого действия (при помощи echo), это оставлю для читателей.
Шаг 7
Сделаем хоть что-то полезное
Относительно полезное
Сформулируем техзадание
Приложение должно после запуска помещать в буфер обмена случайную строку из файла и оповещать об этом всплывающим сообщением.
За основу возьмем bash-скрипт, случайную строку из файла будем извлекать при помощи подпрограммы на Python’е. Составим план работы скрипта:
- Запустить подпрограмму
- Передать результат работы подпрограммы в буфер обмена
- Вывести всплывающее сообщение
Определимся с названиями директории и файлов приложения:
- папка rndstr в домашней директории
- source — файл из которого будем брать строки
- rndstr.py — подпрограмма выводящая в консоль случайную строку из файла source
- rndstr.sh — файл скрипта
Создаем директорию приложения и переместившись в нее создаем там файлы.
Первые два пункта плана скрипта можно объединить конвейером, в итоге, используя Termux:API получаем:
#!/bin/bash python ~/rndstr/rndstr.py | termux-clipboard-set # 1 и 2 пункты плана работы termux-toast "OK" # 3 пункт. Выводим всплывающее сообщение "ОК"В файл source вы можете поместить любой текст логически разделенный на строки, я решил поместить афоризмы:
Листинг файла sourse
Искренность не есть истина. Л. Лавель Терпи и воздерживайся. Эпиктет Благородно только то, что бескорыстно. Ж. Лабрюйер Будь благоразумно отважным. Б. Грасиан Доброта лучше красоты. Г. Гейне Для великих дел необходимо неутомимое постоянство. Ф.Вольтер Если ты хочешь, чтобы тебе всегда угождали, прислуживай себе сам. Б. Франклин Чрезмерная скромность есть не что иное, как скрытая гордость. А. Шенье Очень умным людям начинают не доверять, если видят их смущение. Ф. Ницше Бедность указывает на отсутствие средств, а не на отсутствие благородства. Д. Боккаччо Нужно остерегаться доведения скромности до степени унижения. А. Бакиханов Кто отказывается от многого, может многое себе позволить. Ж. Шардон Когда нам платят за благородный поступок, его у нас отнимают. Н. Шамфор Не получить вовсе - не страшно, но лишиться полученного обидно. Клавдий Элиан Легче переносить терпеливо то, что нам не дано исправить. Гораций Устаешь ждать, но насколько хуже было бы, если бы ждать стало нечего. Б. Шоу Все приходит вовремя, если люди умеют ждать. Ф. Рабле Своим терпением мы можем достичь большего, чем силой. Э. Берк Надо уметь переносить то, чего нельзя избежать. М. Монтень Кто в деле смел, тот слов не устрашится. Софокл Я не люблю сражаться, я люблю побеждать. Б. Шоу Затравленный и прижатый к стене кот превращается в тигра. М. Сервантес Достойный человек не идет по следам других людей. Конфуций Великий ум проявит свою силу не только в умении мыслить, но и в умении жить. Р. Эмерсон Слава - товар невыгодный. Стоит дорого, сохраняется плохо. О. Бальзак Сдержанность и уместность в разговорах стоят больше красноречия. Ф. Бэкон Кто молчать не умеет, тот и говорить, не способен. Сенека Младший Хорошие манеры состоят из маленьких жертв. Ф. Честерфилд Добрый человек не тот, кто умеет делать добро, а тот, кто не умеет делать зла. В. Ключевский Не произносите бесповоротных суждений! Августин Ничего слишком! СолонНам осталось создать подпрограмму извлекающую случайную строку из файла source.
Распишем алгоритм работы подпрограммы:- Открываем файл source
- Считаем количество строк в открытом файле
- Закрываем файл (нечего его лишнее время открытым держать)
- Генерируем случайное целое число в пределах количества строк файла source
- Открываем файл source
- Выводим строку под номером сгенерированного числа
- Закрываем файл
Реализуем алгоритм на Python (я пишу под Python 3.7):
import random # импортируем для генерации случайных чисел import os # для получения пути path = os.path.abspath(__file__) # получаем прямой путь до файла rndstr.py path = os.path.dirname(path) # преобразуем в путь до директории path = path + '/source' # преобразуем в путь до файла source f = open(path) # открываем файл i = 0 # обнуляем счетчик for str in f: i+=1 # считаем строки файла f.close() # закрываем файл j = int(round(i * random.random())) # генерируем целое случайное число от 0 до i f = open(path) # открываем файл i = 0 # обнуляем счетчик for str in f: # перебираем строки из файла if i == j: # если счетчик строк равен сгенерированному числу print (str, end='') # выводим строку без перехода на новую break # выходим из цикла i+=1 # увеличиваем счетчик на 1 f.close() # закрываем файлПосле того как файлы созданы и записаны, нужно дать права на исполнение файлу rndstr.sh , и создать alias для быстрого запуска.
alias rnst="~/rndstr/rndstr.sh"Теперь введя в терминале rnst мы получим в буфер обмена случайный афоризм, который, например, можно использовать в переписке.
Вот мы и написали хоть что-то полезное. Относительно полезное.
P.S.
Я намеренно в последнем шаге не стал приводить скриншоты и не разобрал подробно некоторые действия, расписав только содержимое файлов, чтобы у читателей была возможность поработать самостоятельно.
Изначально я планировал показать в этом цикле как пользоваться nmap, sqlmap, но и без меня уже много статей на эту тему. Если есть желание, чтобы я продолжил «Termux шаг за шагом», то ниже есть опрос, а в комментариях можете предложить о чем еще написать.
Termux 0.118.0

Termux — представляет собой полноценный эмулятор терминала Linux со всеми его возможностями. С Termux вы можете почувствовать себя владельцем самого настоящего карманного компьютера на Linux.
Лучший Telegram-канал про технологии (возможно)
Среди основных функций приложения: оболочки bash и zsh, редактирование файлов через nano и vim, полноценный доступ и управление серверами через ssh, компилирование кода с помощью gcc и clang, возможность использовать консоль Python в качестве полноценного калькулятора и главное — текстовые игры из frotz.
Termux
ПРИМЕЧАНИЕ. Если у вас возникли проблемы с установкой или обновлением пакетов — см. Https://github.com/termux/termux-packages/wiki/Package-Management.
ПРИМЕЧАНИЕ. Обновление через Google Play в настоящее время приостановлено по техническим причинам. А пока смотрите https://github.com/termux/termux-app#installation, чтобы узнать об альтернативных источниках установки.
Termux сочетает мощную эмуляцию терминала с обширной коллекцией пакетов Linux.
• Наслаждайтесь оболочками bash и zsh.
• Управляйте файлами с помощью nnn и редактируйте их с помощью nano, vim или emacs.
• Доступ к серверам по ssh.
• Разработка на C с помощью clang, make и gdb.
• Используйте консоль Python как карманный калькулятор.
• Проверяйте проекты с помощью git.
• Запускайте текстовые игры с помощью frotz.При первом запуске загружается небольшая базовая система — затем можно установить нужные пакеты с помощью диспетчера пакетов apt. Чтобы получить доступ к встроенной справке, нажмите и удерживайте в любом месте терминала и выберите пункт меню «Справка», чтобы узнать больше.
Хотите прочитать вики?
https://wiki.termux.comХотите задать вопросы, сообщить об ошибках или оставить отзыв?
https://termux.com/communityХотите присоединиться к IRC-чату Termux?
#termux на freenodeПерепрошивка WiFi выключателей Sonoff

Основная часть автоматизации у меня построена на проводных устройствах и контроллерах, но бывает что не обойтись и без беспроводных устройств. Сегодня на операционный стол попал WiFi выключатель Sonoff от китайской компании ITEAD.


Выключатели Sonoff построены на базе WiFi модуля ESP8266.
По умолчанию выключатели запрограммированы на работу через облачный сервис, что упрощает их использование не посвященным в электронику и программирование покупателям. Я не сторонник управления через облачные сервисы и по этому я написал простенький код для управления выключателем Sonoff через MQTT сервер запущенный под IoBroker.
Код написан в среде Arduino IDE.
Разобрав выключатель Sonoff нужно припаять 5 контактную колодку для легкого подключения нашего «программатора» к плате, на фото ниже это контакты 3V3, RX, TX, GND и GPIO14, последний правда для прошивки нам не нужен, его можно использовать как порт ввода/вывода, подключив к нему например датчик температуры и влажности DHT22.
Обратите внимание что питание платы 3.3 вольта.

Для прошивки выключателя потребуется любой переходник USB — TTL, если такового нет то можно использовать Arduino UNO например. Я использовал Arduino UNO, предварительно удалив микроконтроллер из колодки (можно попробовать не убирать микроконтроллер из Arduino а прошивать с постоянно зажатым Reset). В Arduino UNO так же имеется источник питания 3.3 вольта которого более чем достаточно для питания выключателя Sonoff.
ВНИМАНИЕ! Прошивать нужно при отключенном питании 220 В. Так как есть вероятность поражения электрическим током, а в случае с Sonoff POW вообще сгорит компьютер так как в этом выключателе отсутствует гальваническая развязка.

Для того что бы добавить в Arduno IDE платы типа ESP нужно в меню Файл — Настройки — в поле Дополнительные ссылки для менеджера плат вставить ссылку http://arduino.esp8266.com/versions/2.3.0/package_esp8266com_index.json , после чего открыть Инструменты — менеджер плат, найти в списке ESP8266… и нажать кнопку установить.

После установки дополнительных плат нужно выбрать из списка необходимую нам, смотрите скрин ниже:Теперь можно прошивать наш WiFi выключатель Sonoff подобно Arduino с одной оговоркой — для того чтобы ESP8266 на выключателе Sonoff вошла в режим загрузки кода, необходимо на нее подать питание с нажатой кнопкой Setting Switch и не отпуская эту кнопку нажать в программе Arduino IDE кнопку Загрузка и только после того как увидите в окне бегущий прогресс загрузки кода, кнопку на Sonoff можно отпустить.
Update
Добавил код для прошивки Sonoff по воздуху через WiFi так называемый OTA.
OTA если быть точнее FOTA – Firmware Over The Air в переводе с английского «микропрограммы по воздуху» – это обновление системы (прошивки) Вашего устройства с помощью сети интернет.
Для этого необходимо залить эту прошивку первый раз по инструкции выше. Далее установить на компьютер Python 2.7.x https://www.python.org/downloads/ .При установке нужно включить опцию Add python.exe to Path.
Если все прошло гладко то в Arduino IDE в меню Инструменты — порт можно увидеть сетевые порты:

- ← Перепрошивка бутлоадера в Arduino на optiboot
- Контроллер ввода/вывода для умного дома на основе ATmega328 →
