31.08.2010

Подключение к андройду через ssh

Для разработчиков Андроида хорошо известна утилита ADB. В которой есть не менее удобная команда adb shell - которая позволяет подключатся к консольке девайса. Это бывает крайне удобно для системных задач. Одно плохо - под виндами, в cmd, работать с линуховым шеллом крайне неудобно - так и хочется запустить PuTTY.



Однако, не все так просто, необходимо поднять dropbear (облегченный sshd) на зверьке - и тогда наступит счастье. Проблема в том, что в андроиде нет стандартного /etc/passwd - поэтому коннектится можно только по ключу.

Итак, нам понадобится рабочий adb shell (как ставить, где брать - гугл в помощь, начать можно здесь). У меня стоит прошивка CyanogenMod, в котором дропбир уже есть. У кого нет - можно собрать из сорцов (ссылка на сбор есть в этом руководстве).

  • Создадим директории
# adb shell "install -o 0 -g 0 -m 700 -D -d /data/dropbear/.ssh"
  • Сгенерим ключи для сервера
# adb shell "dropbearkey -t rsa -f /data/dropbear/dropbear_rsa_host_key"
# adb shell "dropbearkey -t dss -f /data/dropbear/dropbear_dss_host_key"
  • Протестируем на запуск - дропбир запустится в интерактивном режиме, не подавшись в демоны (ключ -F) на порту 2222. Должно быть без ошибок, выход по Ctrl-C
# adb shell "dropbear -r /data/dropbear/dropbear_rsa_host_key -p 2222 -F -E -v -s"
  • Теперь надо сгенерить ключи для клиента. Ключ можно сгенерить на стороне клиента или сервера. Проще на стороне клиента, с помощью PuTTYgen - the PuTTY key generator из стандартной поставки PuTTY (например, как описано здесь, здесь или здесь).
    Сгенерированный публичный ключ (строчка, которая начинается на ssh-) скопировать в консоль adb в такую команду:
# adb shell "echo 'ssh-rsa ваш_публичный_ключ' > /data/dropbear/.ssh/authorized_keys"
  • И исправим права на файл
# adb shell "chmod 600 /data/dropbear/.ssh/authorized_keys"
#
adb shell "chown root.root /data/dropbear/.ssh/authorized_keys"

Можно и на стороне сервера сделать ключи, но есть нюанс =)
# adb shell "dropbearkey -t rsa -f /data/dropbear/client_rsa_key.private"
#
adb shell "dropbearkey -f /data/dropbear/client_rsa_key.private -y > /data/dropbear/client_rsa_key.public"
В итоге получается два файла с приватным ключом клиента (client_rsa_key.private) и публичным ключем для сервера (client_rsa_key.public). Второй положим серверу куда ему надо:

# adb shell "grep ssh- /data/dropbear/client_rsa_key.public > /data/dropbear/.ssh/authorized_keys"
...а первый сконвертим (если у вас есть dropbearconver, конечно):
# adb shell "dropbearconvert openssh /data/dropbear/client_rsa_key.private /data/dropbear/client_rsa_key.private-ssh"
и заберем себе (это уже на хосте, не в adb)
$ adb pull /data/dropbear/client_rsa_key.private-ssh ./
Все, ваш дропбир готов к запуску. Дальше возможны варианты использования.

Можно запустить доступ только через adb (бОльшая безопасность, но меньшая гибкость):
  • В консоли adb, запустим дропбир:
# adb shell /system/xbin/dropbear -s -E -p 127.0.0.1:2222
  • И, затем, на хосте, пробросим порт до него:
# adb forward tcp:2222 tcp:2222
  • После этого можно коннектится в PuTTY к 127.0.0.1:2222 (не забыв при этом подключить сгенерированный выше приватный ключ!) 
  • По окончанию работы, надо убить демона, штобы злобные хацкеры не проникли в ваш телефон:
# adb shell killall -9 dropbear
Можно запустить доступ на всю сеть - что, возможно, удобнее, но менее безопасно.
# adb shell /system/xbin/dropbear -s -E -p 2222
Не забыв при этом убить демона по окончанию работы - тоже для целей безопасности и порядку.

Кстати, есть и третий вариант использования - можно демона dropbear не убивать и вообще поставить в автозапуск, настрить DynDns и коннектиться к зверьку из любой точки земного шара (непонятно только, зачем =).


Подготовлено по материалам ссылок по тексту, а так же 1, 2, 3.

P.S. Нашел простенькую статью о реверсе баз на андроиде. На память оставлю здесь )