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 на карте памяти смартфона.
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
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, о котором я рассказывал в одной из прошлых статей, позволяет управлять собой через командную строку).
Выводы
Использовать Android в связке с Linux действительно удобно. В отличие от Windows здесь не нужны дополнительные драйверы, специальные серверы и прочие странные вещи. В большинстве случаев можно обойтись стандартными для мира Linux SSH и rsync, но в Сети всегда можно найти более интересные инструменты.