ssh移植到Android

来源:互联网 发布:sql case when isnull 编辑:程序博客网 时间:2024/06/10 08:36

关于openssh的源码可以参看googlesource:

https://android.googlesource.com/


LOCAL_PATH:= $(call my-dir)###################### libssh ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SRC_FILES := \    acss.c authfd.c authfile.c bufaux.c bufbn.c buffer.c \    canohost.c channels.c cipher.c cipher-acss.c cipher-aes.c \    cipher-bf1.c cipher-ctr.c cipher-3des1.c cleanup.c \    compat.c compress.c crc32.c deattack.c fatal.c hostfile.c \    log.c match.c md-sha256.c moduli.c nchan.c packet.c \    readpass.c rsa.c ttymodes.c xmalloc.c addrmatch.c \    atomicio.c key.c dispatch.c kex.c mac.c uidswap.c uuencode.c misc.c \    monitor_fdpass.c rijndael.c ssh-dss.c ssh-ecdsa.c ssh-rsa.c dh.c \    kexdh.c kexgex.c kexdhc.c kexgexc.c bufec.c kexecdh.c kexecdhc.c \    msg.c progressmeter.c dns.c entropy.c gss-genr.c umac.c jpake.c \    schnorr.c ssh-pkcs11.c roaming_dummy.c \    openbsd-compat/strtonum.c openbsd-compat/bsd-misc.c \    openbsd-compat/timingsafe_bcmp.c openbsd-compat/bsd-getpeereid.c \    openbsd-compat/readpassphrase.c openbsd-compat/vis.c \    openbsd-compat/port-tun.c openbsd-compat/setproctitle.c \    openbsd-compat/bsd-closefrom.c  openbsd-compat/getopt.c \    openbsd-compat/rresvport.c openbsd-compat/bindresvport.c \    openbsd-compat/bsd-statvfs.c openbsd-compat/xmmap.c \    openbsd-compat/port-linux.c openbsd-compat/strmode.c \    openbsd-compat/bsd-openpty.c \    openbsd-compat/fmt_scaled.c \    openbsd-compat/pwcache.c openbsd-compat/glob.c#    openbsd-compat/getrrsetbyname.c#    openbsd-compat/xcrypt.c LOCAL_C_INCLUDES := external/openssl/include external/zlibPRIVATE_C_INCLUDES := external/openssl/openbsd-compatLOCAL_SHARED_LIBRARIES += libssl libcrypto libdl libzLOCAL_MODULE := libsshLOCAL_CFLAGS+=-O3include $(BUILD_SHARED_LIBRARY)###################### ssh ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SRC_FILES := \    ssh.c readconf.c clientloop.c sshtty.c \    sshconnect.c sshconnect1.c sshconnect2.c mux.c \    roaming_common.c roaming_client.cLOCAL_MODULE := sshLOCAL_C_INCLUDES := external/openssl/includePRIVATE_C_INCLUDES := external/openssl/openbsd-compatLOCAL_SHARED_LIBRARIES += libssh libssl libcrypto libdl libzinclude $(BUILD_EXECUTABLE)###################### sftp ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SRC_FILES := \    sftp.c sftp-client.c sftp-common.c sftp-glob.c progressmeter.cLOCAL_MODULE := sftpLOCAL_C_INCLUDES := external/openssl/includePRIVATE_C_INCLUDES := external/openssl/openbsd-compatLOCAL_SHARED_LIBRARIES += libssh libssl libcrypto libdl libzinclude $(BUILD_EXECUTABLE)###################### scp ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SRC_FILES := \    scp.c progressmeter.c bufaux.cLOCAL_MODULE := scpLOCAL_C_INCLUDES := external/openssl/includePRIVATE_C_INCLUDES := external/openssl/openbsd-compatLOCAL_SHARED_LIBRARIES += libssh libssl libcrypto libdl libzinclude $(BUILD_EXECUTABLE)###################### sshd ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SRC_FILES := \    sshd.c auth-rhosts.c auth-rsa.c auth-rh-rsa.c \audit.c audit-bsm.c audit-linux.c platform.c \sshpty.c sshlogin.c servconf.c serverloop.c \auth.c auth1.c auth2.c auth-options.c session.c \auth-chall.c auth2-chall.c groupaccess.c \auth-skey.c auth-bsdauth.c auth2-hostbased.c auth2-kbdint.c \auth2-none.c auth2-passwd.c auth2-pubkey.c auth2-jpake.c \monitor_mm.c monitor.c monitor_wrap.c kexdhs.c kexgexs.c kexecdhs.c \auth-krb5.c \auth2-gss.c gss-serv.c gss-serv-krb5.c \loginrec.c auth-pam.c auth-shadow.c auth-sia.c md5crypt.c \sftp-server.c sftp-common.c \roaming_common.c roaming_serv.c \sandbox-null.c sandbox-rlimit.c sandbox-systrace.c sandbox-darwin.o# auth-passwd.cLOCAL_MODULE := sshdLOCAL_C_INCLUDES := external/openssl/include external/zlibPRIVATE_C_INCLUDES := external/openssl/openbsd-compatLOCAL_SHARED_LIBRARIES += libssh libssl libcrypto libdl libz libcutilsinclude $(BUILD_EXECUTABLE)###################### ssh-keygen ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_SRC_FILES := \    ssh-keygen.cLOCAL_MODULE := ssh-keygenLOCAL_C_INCLUDES := external/openssl/includePRIVATE_C_INCLUDES := external/openssl/openbsd-compatLOCAL_SHARED_LIBRARIES += libssh libssl libcrypto libdl libzinclude $(BUILD_EXECUTABLE)###################### sshd_config ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_MODULE := sshd_configLOCAL_MODULE_CLASS := ETCLOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/sshLOCAL_SRC_FILES := sshd_config.androidinclude $(BUILD_PREBUILT)###################### start-ssh ######################include $(CLEAR_VARS)LOCAL_MODULE_TAGS := engLOCAL_MODULE := start-sshLOCAL_MODULE_CLASS := EXECUTABLESLOCAL_SRC_FILES := start-sshinclude $(BUILD_PREBUILT)

既然要移植openssh到android,那么首先需要把ssh的源码放在android代码里面并且使用合适的Android.mk确保android正常编译出正确的Openssh工具

我在android/external/下找到名为openssh的目录文件夹,里面正是openssh的源码。

然而正常情况下ssh工具并不会编译进system.img。

需要做一些些修改。

LOCAL_MODULE_TAGS := 这里需要指定版本。对应你的lunch版本
这些东西如果可以确保无误,那么我们应该能在android系统的/system/bin下面发现Android.mk里面指定的工具

/system/bin/ssh
/system/bin/ssh-keygen
/system/bin/sshd
/system/bin/start-ssh
/system/bin/scp
/system/bin/sftp
/system/etc/ssh/sshd_config

+++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++

移植成功了可能还想将sshd作为一个服务启动在android后台。

这个问题也很简单。

正常的init.rc里面有

mkdir /data/ssh 0750 root shellmkdir /data/ssh/empty 0700 root root
service sshd /system/bin/start-ssh    class main    disabled

我们需要改一下service这边

service sshd /system/bin/start-ssh    class main    user root    group root

重新烧录一个版本,就没啥问题啦。

==================================================================================================================================

dropbear的安装与使用

源码地址

https://github.com/barryk/android_external_dropbear

【这个版本只到0.52,而0.52只支持一种密钥交换协议diffie-hellman-group-sha1

后续我会写如何添加其他密钥交换协议】

android4.4之后就没有dropbear了。

可以在android/external/下面手动建立一个dropbear的文件夹。然后gitclone拷贝好

看看android.mk确认是否正常的编译出来。

作为客户端去连接服务器。我这边验证的是没有问题。

但是想作为服务端,感觉编译出来的dropbear是有问题的。(可以正常作为service启动。但是启动以后发现无法连接上这台设备。)

要作为服务端需要的操作有

在init.rc里面创建必要的文件夹

mkdir /data/dropbear/

mkdir /data/dropbear/.ssh

mkdir /.ssh/

生成ssh服务器密钥

dropbearkey -t rsa -f /data/dropbear/dropbear_rsa_host_key
dropbearkey -t dss -f /data/dropbear/dropbear_dss_host_key

我把生成密钥这部分拿脚本包了起来

在init.rc里面通过:exec /sbin/busybox sh /xxxxx/dropbear_config.sh生成

如果遇到ssh连接以后某些功能如 am.pm等不能正确使用的情况

有两手解决办法 

1 写个.profile 在home目录,在profile文件内容可参考:

#Adding env params for librariesexport LD_LIBRARY_PATH=/vendor/lib:/system/libexport BOOTCLASSPATH=/system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/scala-compiler.jar:/system/framework/scala-library.jar:/system/framework/scala-parser-combinators.jar:/system/framework/scala-reflect.jar:/system/framework/scala-xml.jar:/system/framework/akka23.jar:/system/framework/typesafe-config.jar

2.修改源代码svr-chansession.c:

大致在900多行有addnewvar的函数,你可以仿照里面的USER,LOGNAME等仿照将我们的LD_LIBRARY_PATH等缺失变量写入

因为编译出来的dropbear有问题【没有问题】,在这里提供一下编译完成正常的二进制文件http://download.csdn.net/download/u012839187/10140452

注:经验证,编译出来的二进制文件dropbear并没有问题。问题出在:我在默认的options.h里面给的DROPBEAR_DEFADDRESS “127.0.0.1”,因为设备只监听自己的127地址,又没有做端口映射,自然没有任何人能连上。。。

没有C币可以邮箱向我索要。

参考链接:

http://www.cnblogs.com/hzl6255/p/6124301.html

原创粉丝点击