csatblogspotdotcom

Friday, February 12, 2016

对于Android上ssh的思考

Android可以使用adb连上电脑操作,甚至可以通过wifi方式adb,那更进一步,能否在Android开启ssh服务,使用ssh连接手机进行操作? PC端一般是OpenSSH(现在也有Windows版本,参考https://winscp.net/eng/docs/guide_windows_openssh_server,而FileZilla只是个传送文件的Supports FTP, FTP over SSL/TLS (FTPS) and SSH File Transfer Protocol (SFTP))提供ssh服务,而小型系统如嵌入式和移动设备,dropbear是一个选择,dropbear的获取有几种方法: 1. dropbear官网http://matt.ucc.asn.au/dropbear/提供源码,下载后自己编译; 2. https://code.google.com/archive/p/droidsshd/downloads提供下载已编译好的dropbearmulti; 3. cyanogenmod.org提供Android的ROM,下载对应的ROM后里面含有相关可执行文件,以前的版本是dropbear,从CM9开始已经是OpenSSH了; (有的busybox里面集成了dropbear,参考http://android.stackexchange.com/questions/123183/how-do-i-install-dropbear-ssh-on-android这里面也介绍了安装dropbear的过程,但自己下载的版本里面没看到) 对于第一种方式,需Cross Compiling,参考(http://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BusyBox_for_ARM) 首先官网下载wget http://matt.ucc.asn.au/dropbear/dropbear-2015.71.tar.bz2并解压tar -xvjf dropbear-2015.71.tar.bz2 下一步安装编译器sudo apt-get install gcc-arm-linux-gnueabihf(没有安装libncurses5-dev) 这里需要注意的是gcc-arm-linux-gnueabi和gcc-arm-linux-gnueabihf,前者针对armel architecture的编译器,后者是针对armhf architecture的编译器,armel和armhf有什么区别?简单的说就是armel硬件差点,浮点运算是靠模拟器执行,效率低,针对的是低端,后者是硬件支持浮点运算,高级一些,现在的手机CPU性能越来越好,于是直接使用后者编译吧 接下来进入加压目录执行./configure --host=arm-linux-gnueabihf --prefix=/ --disable-zlib CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld注意这里用不着zlib,使用sftp才用得到,而dropbear是不包含sftp的 再下一步:make 得到几个dropbear、dropbearkey、dropbearconvert、dbclient(这里有点小问题:缺少了可执行文件scp,虽然生成了scpmisc.o和scp.o等文件;另外本想编译到一个文件中也失败) 继续使用arm-linux-gnueabihf-strip dropbear命令对这几个小文件进行瘦身(按我的理解是去掉可执行文件里的debug信息和多余的空格类字符等),可执行文件小了不少 放到Android里执行提示:k_shell/2000:6210: dropbear: No such file or directory,更换为gcc-arm-linux-gnueabi(最初为gcc-arm-linux-gnueabihf)重新编译也一样,(后来又回头折腾了下,网上有的说是动态库/静态库的问题,自己在PC创建了库文件链接,也指明静态库,但结果仍不行;--静态库是编译的时候把库文件包进去,动态库不包而是运行的时候动态加载),自行编译失败; 对于dropbearmulti,从这里:https://code.google.com/archive/p/droidsshd/downloads下载已编译好的dropbearmulti,这个dropbearmulti是一个可执行文件,集成了多个命令,直接执行提示包含以下四个命令: Dropbear multi-purpose version 0.52 Make a symlink pointing at this binary with one of the following names: 'dropbear' - the Dropbear server 'dbclient' or 'ssh' - the Dropbear client 'dropbearkey' - the key generator 'scp' - secure copy 做好几个命令的软连接后,利用命令生成rsa和dss的key: dropbearkey -t rsa -f ****/dropbear_rsa_host_key(dropbearmulti给的默认为/data/data/br.com.bott.droidsshd/files/etc/dropbear_rsa_host_key) dropbearkey -t dss -f ****/dropbear_dss_host_key(dropbearmulti给的默认为/data/data/br.com.bott.droidsshd/files/etc/dropbear_dss_host_key) 开启服务(使用root用户,如普通用户执行后是没反应的): dropbear -A -N username -U 0 -G 0 -C password -p IP:portnumber (以上参考http://www.droidforums.net/threads/ssh-daemon-dropbear-on-android-2-0.9038/和http://paguilar.org/?p=30) 下一步就可以使用客户端连接了,实际使用效果不太好,连接反应有些慢,连上后操作还可以(局域网环境),过一会不操作就没反应了,需要重新连接,而且不管什么用户名,只要登录上去就是root权限,更让人失望的是没有sftp服务,没法在其他系统通过客户端去获取文件,而在其他系统使用scp去获取该系统文件时又提示: sh: /data/data/br.com.bott.droidsshd/files/bin/sftp-server: not found Fatal: Received unexpected end-of-file from server 还是需要sftp服务,如何获取sftp服务?可以利用OpenSSH的sftp(参考http://wiki.beyondlogic.org/index.php?title=Cross_Compiling_SFTP-Server_DropBear_for_ARM;https://www.cybermilitia.net/2009/02/28/dropbear-on-debian/;https://github.com/iMilnb/docs/blob/master/dropbear%2Bsftp-android.md;等) 里面的scp试了下也不行,提示:unknown user 0255,执行dbclient(root或普通用户)则提示:dbclient: exited: Unknown own user(有人说是不同系统libc不一样造成的,参见https://sourceforge.net/p/openqrm/mailman/message/26489043/)有可能是没/etc/passwd但手动加上该文件也不行。。 既然dropbear没有sftp,无法传送文件,对于一个手机打开ssh服务提供终端服务而不能传送文件,有何必要?我想这是个鸡肋,对于一个处理能力和续航能力等各方面性能都普通的移动设备来说,要么什么都不打开,要么临时打开提供传送文件,具体如何实施更为简洁?上面提到的第三种方法值得一试,到CyanogenMod官网找到自己的手机型号,下载相关ROM,拷贝ROM中所需文件到自己目录直接使用; 下载到一个cm-7.2.0-galaxysmtd.zip,东西很全,里面包含dropbear、dropbearkey、scp、sftp-server、ssh,(这一套dropbear的默认路径为/data/dropbear,另外还有个/dtata/.ssh里面有个known_hosts),甚至bash、sqlite3、tcpdump、vim、busybox、iptables等诸多程序也自带了,很不错。把那几个文件复制到和ROM中同样的/system/xbin或者/system/bin,sftp-server没啥提示,也不想折腾了,dropbear是OK的,先用dropbearkey生成key,再开启dropbear,普通用户也可以开启,但是别人登录的时候就不行,用root用户开启ssh服务就可以正常登录;ssh(client)有点问题(为了执行ssh(client)专门在笔记本上装了个ssh server(win版OpenSSH))对root来说,提示unknown host是否信任,之后输入啥都没反应除非杀死进程,只有普通用户使用ssh才OK;另外scp如果root使用也和ssh一样不OK,普通用户从其他地方拷贝文件到本地OK,需要注意的是默认目录是C:/(Windows)或/(Linux),下载到其他目录需要自己添加路径后缀,root或普通用户拷贝远程的文件到本机也是要么lost connection要么输入密码后没反应了,为何?路径问题,默认C:/(Windows)或/(Linux)手动指明路径后OK,例如:scp ./test1 ssh@192.168.1.**:/users/ssh/test1(ssh是用户名),或scp a.txt ***@***:/home/***/; CyanogenMod从版本9开始是OpenSSH,试了下cm-10.2.1-jfltexx.zip,里面包含sshd、ssh、scp、sftp、ssh-keygen,执行sshd、ssh、scp、sftp全提示需要libssh.so,拷贝libssh.so过来到/system/lib/,不行,提示cannot locate symbol "EVP_ripemd160" referenced by "libssh.so"...,libssl.so也过来(系统原有libssl.so先备份),也不行,提示一样,重启,还不行,提示不变; 看来直接拷贝过来的可执行文件不是那么靠谱,OpenSSH那一套行不通,估计是缺少了正确的依赖文件,dropbear那一套部分可用(dropbear服务和ssh,scp和sftp-server不OK); 另外对于dropbear开ssh server,CM官网有介绍https://wiki.cyanogenmod.org/w/Doc:_dropbear,可以采用rsa key的方式免密码登录,或者更改root密码通过root+密码方式登录,过程介绍很详细; 仔细想想,这些东西对于一个手机来说到底有没有用呢?首先手机各方面性能,包括续航能力、计算能力、安全性,各方面都不如PC,尤其是安全问题(dropbear等可执行文件被其他程序利用了开了端口,所以放在那里也不安全),并不适合开启服务给别人连接,而且手机上的app也多且实用,通信方面足够用了,打电话、浏览网页、聊天等,如果PC连手机,adb足够,拷贝东西?直接把手机当存储设备吧。只有极少应用场景,例如有时候急需ssh到某处,那就留下ssh和scp客户端吧(root没法用只能普通用户用),其他的看个人喜好 后记: cellular connection时如果运营商为手机提供公网IP且允许inbound连接被访问,那么可以从其他位置访问ssh服务,如果不是,例如运营商封了inbound的端口或者分配了内网IP,那么及时手机开了ssh服务也没法被外部直接访问,不过可以试一下dynamic domain name service动态域名解析服务,给手机IP分一个域名,绑定,例如http://no-ip.com 或 http://dyndns.com,相关应用DynDNS for Android,参考http://www.droidforums.net/threads/ssh-daemon-dropbear-on-android-2-0.9038/

Labels: , , ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home