Openssh 移植到 Android 系统的步骤
1、 由于 android SDK 中一般不带有 openssh 源码的,虽然原版的
android 源码中是带有的,所以需要先找到 android 下 openssh 源
码,在 github 上可以克隆得到:
$git
将该源码克隆到本地 android 源码的 external 目录下,如果 external
clone https://android.googlesource.com/platform/external/openssh
下已经有该文件夹,但是大多时候是空的,external 目录里都是一
些扩展模块。
2、 编译 openssh 模块,因为在上面的 github 中得到的源码是带有
Android.mk 的,但是并没有配置编译进整个系统,所以需要修改
相关的配置(具体如何修改没有找到答案),现在采用单独编译模
块的方式,因为 openssh 依赖 zlib 库和 openssl(这两个源码是自
带的,如果没有也可在 github 上克隆得到),所以需要先编译 zlib
和 openssl:
$source build/envsetup.sh
$mmm -B external/zlib
$mmm -B external/openssl
$mmm -B external/openssh
编译之后将会生成一下文件:
#编译 zlib 生成的文件
/out/target/product/rk3288/system/lib/libz.so
/out/target/product/rk3288/system/bin/gzip
#编译 openssl 生成的文件
/out/target/product/rk3288/system/lib/libcryphto.so
/out/target/product/rk3288/system/lib/libssl.so
/out/target/product/rk3288/system/bin/ssltest
/out/target/product/rk3288/system/bin/openssl
#编译 openssh 生成的文件
/out/target/product/rk3288/system/lib/libssh.so
/out/target/product/rk3288/system/bin/ssh
/out/target/product/rk3288/system/bin/sftp
/out/target/product/rk3288/system/bin/scp
/out/target/product/rk3288/system/bin/sshd
/out/target/product/rk3288/system/bin/ssh-keygen
/out/target/product/rk3288/system/bin/start-ssh
/out/target/product/rk3288/system/etc/ssh/sshd_config
将所有以上生成的文件采用 adb push 的方式 push 进系统中相应的
位置,将 lib 下的 push 进系统/system/lib/下,将 bin 文件都 push
进/system/bin/下,将 sshd_config 文件先进行如下修改后再 push
进系统的/system/etc/ssh/下,如果 system/etc/下没有 ssh 文件,那
么需要先 mkdir ssh 创建该目录。
3、 因为在 linux 中使用 ssh 我们一般都是采用 username:passwd
的方式,但是在 android 中是没有这一概念的,网上有人说可以采
用修改源码或者添加伪用户的方式(但是并未找到这两种方式具
体如何操作,所以没有采用),另外一种方式就是使用密钥登录,
采用该方法即可实现 root 无密码登录,但是需要修改 sshd_config
文件,将上一步骤中生成的/etc/ssh/sshd_config 文件进行如下修
改:
将#Port 22 改为 Port 22
讲#PermitRootLogin yes 改为 PermitRootLogin without-password
将#RSAAuthentication yes 改为 RSAAuthentication yes
将#PubkeyAuthentication yes 改为 PubkeyAuthentication yes
将 PasswordAuthentication no 改为#PasswordAuthentication no
将#PermitEmptyPasswords no 改为 PermitEmptyPasswords
yes
将
#ChallengeResponseAuthentication
yes
改
为
ChallengeResponseAuthentication yes
将#UsePrivilegeSeparation yes 改为 UsePrivilegeSeparation no
将/data/ssh/sshd_config 改为 internal-sftp
最后,更改该文件的权限为 600,chmod 600
sshd_config。
4、 创建目录结构,在系统中 data 目录下创建 ssh 和 empty 文件
夹,empty 文件夹在运行 sshd 服务的时候需要的,源码中应该是
有这个定义的,所以不创建 empty 空文件夹的话,运行 sshd 服务
的时候会报错:
$mkdir
-p /data/ssh
$mkdir
-p /data/ssh/empty
$chmod 700 /data/ssh
$chmod 700 /data/ssh/empty
5、 在 sshd_config 中可以看到其中有这样三个配置
HostKey
/data/ssh/ssh_host_rsa_key
HostKey
/data/ssh/ssh_host_dsa_key
AuthorizedKeysFile /data/ssh/authorized_keys
所以由此可知,为何会有上一步中创建文件夹 ssh,另外也需要有
上面三个秘钥,所以在系统的/data/ssh/文件夹下需要生成秘钥:
$cd
/data/ssh/
$ssh-keygen -t
rsa
$ssh-keygen -t dsa
-f
-f
ssh_host_rsa_key
-N “”
ssh_host_dsa_key
-N “”
在主机 PC windows/ubuntu 下生成通讯的密钥:
#ssh-keygen
-t
rsa
-C
“your_email_address”
// 将
your_email_address 换做自己的邮箱地址。
该命令会在主目录下生成.ssh 目录,目录下包含 id_rsa(私钥)和
id_rsa.pub(公钥)两个文件。然后将 id_rsa.pub 文件 push 进 android
系统中:
#adb push id_rsa.pub /data/ssh/authorized_keys
#adb shell
chmod 600 /data/ssh/authorized_keys
#adb shell
chown root:root
/data/ssh/authorized_keys
最后,将 id_rsa 和 id_rsa.pub 拷贝到任何一个需要连接 android 终端
的 PC 中,用于配对 ssh 连接。备注:该通讯秘钥对不一定使用
ssh-keygen
-t
rsa
-C
“your_email_address”产生,也可以使用
SecureCRT 产生,网上可以找到该教程。使用 id_rsa 和 id_rsa.pub 的
方法如上。
6、 首先要保证 android 端 sshd 服务启动,所以可以手动在 android
系统中启动 sshd 服务。PC 端即可使用 ssh 登录,SecureCRT 和
winSCP 均 可 以 登 录 使 用 ,ubuntu 下 可 以 采 用 以 下 指 令 :ssh
root@ip_address 的方式登录。为了能够自动启动 sshd 服务,可以
在 init.rc 中添加该服务。那么如何启动 sshd 服务呢,首先我尝试
了直接运行/system/bin/start-ssh,发现不成功,之后在网上又搜索
了一下,找到正确方式。生成启动脚本:
$mkdir
-p /data/local/userinit.d
在该文件夹下新建一个文件,暂命名为 99sshd(为了区分 sshd 文
件,引发不必要的影响,所以不直接命名为 sshd),该文件的内容
复制/system/bin/start-ssh,所以可以这样操作,将 start-ssh 复制到
/data/local/userinit.d 下,在使用 mv 指令修改其名字为 99sshd。再
更改其权限为 755。之后就可以手动启动,也可以添加到 init.rc 中。