Android для юниксоида. Используем смартфон в связке с Linux

Android и дистрибутивы Linux не просто родственные ОС — они основаны на одном ядре и на низком уровне очень похожи. В Android работает большинство команд Linux, сюда можно установить bash, писать скрипты и даже запускать серверы. Установив на смартфон SSH, ты можешь ходить на него с компа и даже использовать rsync для синхронизации файлов. Обо всем этом мы и поговорим сегодня.

ADB

Начнем с излюбленного инструмента всех продвинутых пользователей Android — ADB. Мы уже много раз писали о нем, однако здесь просто обязаны повториться. Итак, ADB расшифровывается как Android Debug Bridge, и по сути это нечто вроде системы управления смартфоном с компа. ADB позволяет устанавливать и запускать софт, перемещать файлы с устройства и на устройство и выполнять многие другие задачи.

Чтобы настроить ADB в Windows, пришлось бы устанавливать драйверы и перезагружать машину, в Linux он просто работает. Достаточно активировать ADB на смартфоне (Настройки → Для разработчиков → Отладка по USB) и установить пакет с утилитой adb в систему:

# Ubuntu/Debian/Mint

$ sudo apt-get install adb

# Arch Linux

$ sudo pacman -S android-tools android-udev

Далее необходимо подключить смартфон к компу и начать отдавать команды.

Получение списка подключенных устройств:

$ adb devices

Установка на подключенное устройство APK:

$ adb install file.apk

Перемещение файла на устройство:

$ adb push файл /sdcard/

Скачивание файла с устройства:

$ adb pull /sdcard/DCIM/Camera/photo.jpg photo.jpg

Сделать скриншот и скачать его на комп:

$ adb shell screencap /sdcard/screenshot.png $ adb pull /sdcard/screenshot.png $ adb shell rm /sdcard/screenshot.png

Нажатие кнопки Power:

$ adb shell input keyevent 26

Ну и конечно же, ADB можно использовать для получения доступа к командной строке смартфона:

$ adb shell

Важно отметить, что ADB может работать не только по USB, но и по Wi-Fi, однако для этого нужны права root на устройстве и приложение WiFi ADB. Запускаем приложение, включаем переключатель и подсоединяемся к смартфону с помощью adb connect и показанного приложением IP-адреса:

$ adb connect IP-адрес

Внимание

В некоторых дистрибутивах ADB может не работать без прав root. Так происходит из-за отсутствия специальных правил Udev в дистрибутиве. Придется либо устанавливать их как отдельный пакет (android-udev в Arch Linux), либо настраивать Udev самостоятельно.

Adb-sync

ADB можно использовать и для синхронизации файлов между устройствами (для этого даже есть опция sync), однако удобнее воспользоваться скриптом adb-sync. Его достаточно скачать и запустить. Например, так можно синхронизировать музыку на устройстве и на ПК:

$ adb-sync ~/Music/ /sdcard/Music

А так выполнить ту же синхронизацию, но с удалением файлов, которые были удалены на ПК:

$ adb-sync --delete ~/Music/ /sdcard/Music

Простой способ скачать файлы на комп (обратная синхронизация):

$ adb-sync --reverse /sdcard/Download/ ~/Downloads

Adbfs

Еще один интересный способ получить доступ к файлам на устройстве с помощью ADB — использовать adbfs, псевдоФС, которая позволяет смонтировать устройство так, будто это флешка или любой другой накопитель.

Проще всего установить adbfs в Arch Linux. Здесь она есть в AUR, поэтому достаточно выполнить одну команду:

$ yaourt -S adbfs-rootless-git

В Ubuntu и других системах adbfs придется собирать вручную:

$ sudo apt-get install libfuse-dev android-tools-adb $ git clone [[git://github.com/spion/adbfs-rootless.git]] $ cd adbfs-rootless $ make

Ну а дальше можно подключать файловую систему:

$ mkdir ~/Android $ adbfs ~/Android

Для отключения:

$ fusermount -u ~/Android

Зачем еще можно использовать Adb-sync?

  • Для внешней антивирусной проверки новых файлов со смартфона
  • Для точной синхронизации времени по атомным часам

Go-mtpfs

Еще один вариант подключения устройства как файловой системы — go-mtpfs, файловая система, позволяющая передавать данные по протоколу MTP. Именно этот протокол используется в смартфонах без карты памяти.

В Arch Linux установить go-mtpfs очень просто:

$ yaourt -S go-mtpfs

В других дистрибутивах несколько сложнее:

$ sudo apt-get install golang-go libusb1-devel $ mkdir /tmp/go $ export GOPATH=/tmp/go $ go get github.com/hanwen/go-mtpfs $ go install github.com/hanwen/go-mtpfs

Дальше все так же элементарно, как с adbfs:

$ mkdir ~/Android $ go-mtpfs ~/Android

Для отключения:

$ fusermount -u ~/Android

SSH

Идея использовать ADB для общения с устройством может показаться странной, если учитывать, что для Android существует сразу несколько различных SSH-серверов, не требующих права root. Так оно и есть, во многих случаях SSH будет удобнее и эффективнее. В качестве реализации сервера советую выбрать SimpleSSHD, простую бесплатную обертку для проверенного временем SSH-сервера DropBear для встраиваемых систем. Если у тебя есть root, то рекомендую также установить BusyBox On Rails, набор утилит командной строки, наиболее близкий к дистрибутивам Linux.

Использовать SimpleSSHD очень просто. Запускаешь, нажимаешь START и подключаешься к указанному IP-адресу (порт 2222):

$ ssh 192.168.31.236 -p 2222

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

SimpleSSHDSimpleSSHD

Bash, tmux, mc

SSH-сервер на смартфоне сам по себе открывает широкие возможности, но еще шире их можно сделать, если установить на смартфон классические инструменты, такие как bash, tmux и mc. Последний позволит в том числе с удобством ходить по карте памяти и прибраться в случае необходимости.

Сразу предупрежу, что потребуются права root на смартфоне.

Итак, скачиваем Terminal IDE, переименовываем пакет APK в ZIP, распаковываем, находим файл assets/system-2.0.tar.gz.mp3, переименовываем, убирая расширение mp3, и распаковываем. Внутри будет множество каталогов и файлов, из которых нас интересуют только /system/bin и /system/etc/terminfo. Первый содержит нужные нам утилиты; скопируй те, что тебе пригодятся, в отдельный каталог. Второй необходим для корректного функционирования утилит.

Выбранные утилиты и каталог terminfo скинь на карту памяти смартфона. Затем подключись к нему по SSH и введи следующие команды, чтобы получить возможность модификации системного каталога:

$ su 
# mount -o remount,rw /system

Далее скопируй все нужные утилиты в /system/xbin/ и установи на них бит исполнения (на примере bash):

# cp bash /system/xbin/
# chmod 755 /system/xbin/bash

Затем создай файл /sdcard/ssh/.bashrc, помести в него следующие строки:

export TERMINFO=/sdcard/terminfo export TMPDIR=/data/local/tmp export PS1="\u@\h:\w \$ "

Открой настройки SimpleSSHD на смартфоне и в опции Login Shell укажи /system/xbin/bash, останови и вновь запусти сервер. При следующем входе по SSH откроется bash и будут доступны скопированные тобой утилиты.

Чтобы добиться корректной работы Vim и mc, скопируй на карту памяти также каталоги /etc/mc и /etc/vim, а в файл /sdcard/ssh/.bashrc добавь строки:

export MC_DATADIR=/sdcard/mc export VIMRUNTIME=/sdcard/vim

Midnight commander, запущенный в Android

Rsync

SSH-сервер дает нам возможность использовать rsync, мощную утилиту для синхронизации и бэкапа файлов. Rsync позволяет осуществлять быструю двунаправленную синхронизацию файлов между двумя машинами (или машиной и смартфоном, как в нашем случае) с выкачиванием только новых и измененных файлов и возможностью возобновления прерванной синхронизации.

Простейший пример использования rsync в связке со смартфоном:

$ rsync --update --progress -e 'ssh -p 2222' -azv 192.168.31.236:/sdcard/DCIM/Camera ~/Photos

Эта команда скопирует все фотографии со смартфона в каталог ~/Photos, пропустив те, что уже есть в каталоге. Связка опций -azv в данном случае означает, что каталог необходимо передать как есть со всеми его подкаталогами и правами доступа (флаг -a) плюс использовать сжатие (флаг -z).

Обратная команда — копирование данных с машины на смартфон:

$ rsync --delete --progress -e 'ssh -p 2222' -azv ~/Books 192.168.31.236:/sdcard/Books

Здесь мы использовали флаг –delete, чтобы удалить файлы, которые были удалены из локального каталога ~/Books.

По умолчанию при обрыве соединения rsync будет удалять частично переданные файлы. Чтобы этого избежать, можно использовать флаг –partial, который заставит rsync сохранять недокачанные файлы и возобновить их загрузку при следующем запуске команды.

SSHButton

Хорошо, к смартфону мы подключились, файлы синхронизировали, но что, если нам нужно обратное SSH-подключение от смартфона к компу? В этом случае подойдет любой из десятков SSH-клиентов для Android (тот же ConnectBot, например), если, конечно, ты готов вводить команды на сенсорной клавиатуре маленького экрана.

Если не готов, твой выбор — приложение SSH button, позволяющее запускать нужную команду на нужной машине по нажатию кнопки. Интерфейс у SSH button страшный, но приложение отлично работает. Просто запусти SSH button, далее Меню → Add… и введи нужную команду, адрес SSH-сервера, логин и пароль.

SSH button удобно использовать для выключения или усыпления компа (команды systemctl suspend и halt), запуска и остановки торрентов, контролирования музыки (например, плеер mocp, о котором я рассказывал в одной из прошлых статей, позволяет управлять собой через командную строку).

SSH buttonSSH button

Выводы

Использовать Android в связке с Linux действительно удобно. В отличие от Windows здесь не нужны дополнительные драйверы, специальные серверы и прочие странные вещи. В большинстве случаев можно обойтись стандартными для мира Linux SSH и rsync, но в Сети всегда можно найти более интересные инструменты.

Источник