Introduction
Android has it’s ADB
and it’s great. But for me, it’s not always enough,
especially since it has no way to authenticate the user and there is no
encryption. That’s why I need SSH too. OpenSSH is to big for
embedded systems so I’m using dropbear.
Dropbear is already inside of Android tree, in external/dropbear
directory. Problem is, Android.mk
is configured to only compile SSH
client while I need a server. So there are two solutions -
changing Android.mk
to also compile server or build it externally. In
this article I will show the later approach.
I don’t want to deal with /etc/passwd
, /etc/shell
and similar files
and I’m only interested in logging in as root
user using public key
(no password authentication). I also only need server side tools
(specifically dropbear
, scp
and dropbearkey
). I’ve configured my build to do
exactly this, ignoring issues I might have without those
simplifications. If you have some other needs, you may need to tweak
your configuration accordingly.
Compilation
First, download dropbear
tarball from its official site. After
decompressing it, you have to override ancient config.sub
and config.guess
files from the archive with the newest ones. You need newer versions so
that android toolchain (androideabi
) is recognized:
$ wget https://matt.ucc.asn.au/dropbear/dropbear-2013.58.tar.bz2
$ tar -xjf dropbear-2013.58.tar.bz2
$ cd dropbear-2013.58
$ wget -O config.sub "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD"
$ wget -O config.guess "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD"
The build will use precompiled Android toolchain. It is required to specify
sysroot
path so that static libraries and include files can be found.
This can be done with CFLAGS
and LDFLAGS
environment variables. As
always, toolchain binaries have to be on the PATH
:
$ ANDROID=/path/to/your/androidtree
$ SYSROOT=${ANDROID}/prebuilt/ndk/android-ndk-r6/platforms/android-9/arch-arm/
$ export CFLAGS=--sysroot=$SYSROOT
$ export LDFLAGS=--sysroot=$SYSROOT
$ export PATH=${ANDROID}/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/:$PATH
Next, you have to patch couple of files. All the changes I’ve made are in
this file. It changes some options in option.h
, fixes problem
with S_IWRITE
in scp.c
, changes svr-auth.c
so that we can login
without /etc/passwd
and /etc/shell
files and sets android specific
environment variables (so that android utilities like am
, setprop
and getprop
can be used) in svr-chansession.c
file:
$ patch -p1 < dropbear-android.patch
After applying this patch, it’s time to configure build system. But
before compiling the programs, you have to make small change to
config.h
file generated by configure
script:
$ ./configure --host=arm-linux-androideabi --disable-utmp --disable-wtmp --disable-utmpx --disable-utmpx --disable-zlib --disable-syslog
$ echo "#define USE_DEV_PTMX 1" >> config.h
$ make PROGRAMS="dropbear dropbearkey scp" strip
Conclusions
That’s it. You have a small (about 260KB) SSH server, plus 100KB for
dropbearkey
and 40KB for scp
binaries. None large changes were need,
there are no dependencies to build and the steps are quite easy to
follow. I also hope that you will find some of the steps useful when
cross-compiling some other software for Android devices.