Android上sshd的使用

1. 介绍

因为某些原因, 笔者需要在android上开发,  使用adb比较麻烦, 于是想使用sshd.

推荐的软件是openssh, 其他选择有dropbear, mosh.
当然还有其他选择, 如termux, 这里不予讨论

2. 编译配置

在Android中已经有openssh包, 位于external/openssh
默认openssh没有编译进Android系统, 需要进行配置

2.1 openssh模块

首先我们要了解Android中程序都是以模块(PACKAGES)的形式唯一存在的
我们按照既定的规则在模块中添加Android.mk的文件, 通过LOCAL_MODULE来定义
对于openssh, 它包含了如下模块

scp, sftp, ssh, sshd, sshd_config, ssh-keygen, start-ssh

2.2 Android编译系统

其次就是需要我们将openssh模块添加到Android的编译系统中去
而所有需要编译进Android中的模块则通过PRODUCT_PACKAGES变量来定义

Android在编译时候通常通过lunch在制定target
以bpi为例, 使用的命令是lunch mars_a31s-eng
而mars_a31s-eng则在device/softwinner/mars-a31s/vendorsetup.sh中定义

add_lunch_combo mars_a31s-eng

而该target又制定了总Makefile, 位于device/softwinner/mars-a31s/AndroidProducts.mk

PRODUCT_MAKEFILES := \    $(LOCAL_DIR)/mars_a31s.mk

mars_a31s.mk又包含了其他林林总总的Makefile, 其中就包含了device/softwinner/fiber-common/fiber-common.mk
我们就把openssh模块添加到fiber-common.mk文件中

在fiber-common.mk中新增如下内容

# OpensshPRODUCT_PACKAGES += \    scp \    sftp \    ssh \    sshd \    sshd_config \    ssh-keygen \    start-ssh

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

然后重新编译Android系统

2.3 openssh文件

编译完成后烧录或者刷机后, 可以看到文件系统中openssh的文件分别在如下位置(CM中有所不同)

/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

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3. openssh配置

在Linux中使用ssh我们一般都是采用username/password的方式
但是在Android中是没有这一概念的, 当然可以通过修改源码或者添加伪用户的方式
笔者这里采用的是ssh的另一个使用方法即使用密钥登录登录

注意: 以下命令均在root下执行

3.1 创建目录结构

mkdir -p /data/ssh/emptychmod 700 /data/sshchmod 700 /data/ssh/empty

其中, /data/ssh用来存放密钥文件和sshd配置文件

3.2 生成配置文件

cat /system/etc/ssh/sshd_config | \
    sed ‘s/#PermitRootLogin yes$/PermitRootLogin without-password/‘ | \
    sed ‘s/#RSAAuthentication yes/RSAAuthentication yes/‘ | \
    sed ‘s/#PubkeyAuthentication yes/PubkeyAuthentication yes/‘ | \
    sed ‘s/PasswordAuthentication no/#PasswordAuthentication no/‘ | \
    sed ‘s/#PermitEmptyPasswords no/PermitEmptyPasswords yes/‘ | \
    sed ‘s/#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication yes/‘ | \
    sed ‘s/#UsePrivilegeSeparation yes/UsePrivilegeSeparation no/‘ | \
    sed ‘s;/usr/libexec/sftp-server;internal-sftp;‘ > \
    /data/ssh/sshd_config
chmod 600 /data/ssh/sshd_config

这里需要说明的是我们需要配置为root使用, 同时又不需要密码.

另外, 需要注意配置文件中指定了AuthorizedKeysFile为/data/ssh/authorized_keys

3.3 生成密钥

在Windows/Linux上通过下面的命令来生成密钥

ssh-keygen -t rsa -C "your_email_address

上面的命令会在主目录下生成.ssh目录, 目录包含id_rsa(私钥)和id_rsa.pub(公钥)两个文件

然后通过adb等命令将id_rsa.pub上传至Android中(!!!文件要对应于AuthorizedKeysFile!!!)

adb push id_rsa.pub /data/ssh/authorized_keyschmod 600 /data/ssh/authorized_keyschown root:root /data/ssh/authorized_keys

3.4 生成启动脚本

mkdir -p /data/local/userinit.dcat /system/bin/start-ssh | \    sed ‘s;/system/etc/ssh/sshd_config;/data/ssh/sshd_config;‘ > \    /data/local/userinit.d/99sshdchmod 755 /data/local/userinit.d/99sshd

通过上面的命令单独生成一个启动脚本
然后就可以通过执行下面的脚本来启动sshd

/data/local/userinit.d/99sshd

实际操作过程中如果出现问题也可以通过下面的命令以调试的方式来启动sshd

/system/bin/sshd -f /data/ssh/sshd_config -D -ddd

3.5 连接sshd

使用命令即可连接sshd

ssh [email protected]

需要注意的是在Windows下使用ssh客户端时需要配置使用密钥登录选项, 并指定密钥文件
具体选项的位置则依据工具的不同而不同

同理SFTP和SCP登录也如此
笔者发现WinSCP由于没有可配置项导致无法成功连接SFTP, 而FileZilla则可以

4. sshd自启动

现在sshd已经可以成功运行并登录, 接下来需要做的则是让sshd可以自启动

4.1 修改init.rc

这是最直接的办法, 问题在于init.rc是由boot.img动态生成的initramfs而产生
故而即使在已经运行的文件系统中修改了, 重启后还是会恢复原来的内容
那么就只能在源代码中修改后再行编译

找到system/core/rootdir/init.rc, 发现已经包含了sshd的内容, 只是默认被禁用了, 而且启动方式也不是我们期望的

service sshd /system/bin/start-ssh    class main    disable

将init.rc修改为

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

4.2 其他文件

另外需要修改的文件包括如下external/openssh/start-ssh和external/openssh/sshd_config.android

具体的修改内容可以参考前文描述

参考:
<Sshd howto for CM>
<理解Android Build系统>
<Android启动过程深入解析>
<从CM刷机过程和原理分析Android系统结构>

时间: 2024-11-05 06:12:31

Android上sshd的使用的相关文章

Unity3D之AssetBundle学习:Android上运行笔记

路径统一 在Android上加载StreamingAssets文件夹下的AssetBundle文件,首先需要对加载地址进行处理,注意PC.Android和IOS的地址不一致需要针对不同的平台不同的处理,通用代码如下: 1 //统一不同平台下 StreamingAssets 路径 2 public static readonly string STREAMING_ASSETS_PATH = 3 #if UNITY_ANDROID 4 "jar:file:///" + Applicatio

SharePanel – Android上简单的一键分享,可分享到微信QQ和新浪微博

SharePanel – Android上简单的一键分享,可分享到微信QQ和新浪微博 SharePanel Android上简单的一键分享可分享到微信QQ和新浪微博 简介 效果图 代码块 简介 最近在写一个小程序长微博工具,效果就是编辑长微博,然后一键分享到微信.QQ和新浪微博. 一开始是想直接用Intent.createChooser(target, title)来做,后来一想,这样做不是很好啊,会有许多乱七八糟的应用弹出来,我想优先分享到微信.QQ和微博,于是找了点资料,将一键分享这个部分做

ffmpeg在android上输出滑屏问题处理

ffmpeg部分机器上有花屏的问题 原代码如下: while(av_read_frame(formatCtx, &packet)>=0 && !_stop && NULL!=window && bInit) { // Is this a packet from the video stream? if(packet.stream_index==videoStream) { // Decode video frame avcodec_decode

Android上方便地开发的C程序

如果你基于没有一个专门的开发板练手,那你的Android手机也可以开发大多数C应用程序,安装好后编译C的编译器.本文只写一个Hello World的运行过程.优点是:不需要eclipse,不需要Android源码,不需要Android.mk,不需要NDK.一个C程序员就可以很好的利用Android了,需要一个编译器和一个adb要把程序放到Android系统中. 1.安装adb sudo apt-get install android-tools-adb 2.安装交叉工具链 sudo apt-ge

Android 上的 制表符(tab) —— 一个神奇的字符 (cocos2dx crash)

今天测试发现了游戏的一个问题,系统邮件,如果发了tab,在android上一打开邮件内容就会crash.而且他们很确定是tab的问题. 凭我多个月的经验(确实没多年...)来看,从来没听说在android上会因为一个tab崩溃,而且如果有这个问题,肯定会有很多人遇到,估计早就吵翻天了,搜索了一下,什么可用信息都没有. 于是写个测试工程测试了一下,分别在mac下和windows下,用文本编辑工具编辑了4个txt文档,utf有bom和无bom,内容是" tab abcd ",发现都能正常显

Android上解析Json格式数据

package com.practice.json; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class JsonDemo extends Activity { /*http://www.hui

在Android上运用Anko和Kotlin开发数据库:SQLite从来不是一件轻松的事(KAD25)

作者:Antonio Leiva 时间:Mar 30, 2017 原文链接:https://antonioleiva.com/databases-anko-kotlin/ 事实告诉我们:在Android中编写数据库是相当无聊的. 使用SQLite时,所需的所有模板在当今世界上都不是一件最令人愉快的事情. 所幸的是,在最新一次Google I / O会议上,它们宣布的其中一项事项(称其为:Room),就是为简化这项工作,开发出足够的库. 然而,运用Anko,我们仍可以继续像使用低级别框架一样工作,

Android上使用OpenGLES2.0显示YUV数据

在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源,如果以这样的形式播放视频,手机会很热,所以我们尽量让GPU来做这件事: 3.OpenGLES是Android集成到自身框架里的第三方库,它有很多的可取之处. 博主的C/C++不是很好,所以整个过程是在Java层实现的,大家见笑,我主要参考(但不限于)以下文章,十分感谢这些朋友的分享: 1. htt

Android上的MVP:如何组织显示层的内容

MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了,大家也都在讨论关于MVP的理论,只是结构化的资料非常少.这就是我写这篇博客的原因,我想鼓励大家多参与讨论,然后把MVP模式运用在项目开发中. 什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不