引言
我们的板子和客户的板子通过网线相连接,然后用外壳包装起来了,客户的板子外接了网口、usb口和串口等接口,而我们的板子在壳子外面没有留出任何的接口,唯一可以登录到我们板子的方法是:通过客户的板子和我们板子的网线连接,利用ssh登录到我们板子上。如果我们的板子出现问题,并且网络也不通了,那就只有拆机,把调试接口接出来定位问题。这设计太 操蛋了,为了在网络通的情况下可以定位我们自己板子的问题,所以在我们的android10系统上必须配置好sshd工具。
编译方法
如果没有openssh的源码,可以采用如下命令下载其源码:
$ git clone https://android.googlesource.***/platform/external/openssh
编译之前先打上如下补丁,这个补丁是使用sshd过程中遇到的问题而打上的。
$ source build/envsetup.sh
$ cd external/openssh
$ mm .
编译生成的文件如下:
/out/target/product/rk3568/system/lib64/libssh.so
/out/target/product/rk3568/system/lib/libssh.so
/out/target/product/rk3568/system/etc/ssh/sshd_config
/out/target/product/rk3568/system/bin/start-ssh
/out/target/product/rk3568/system/bin/ssh-keygen
/out/target/product/rk3568/system/bin/ssh
/out/target/product/rk3568/system/bin/sshd
移植过程
1、整体编译
上述是编译模块,如果在编译整个android系统时也要编译openssh,需要在device/rockchip/rk356x/device.mk中增加如下代码
PRODUCT_PACKAGES += \
libssh \
ssh \
scp \
sshd \
sshd_config \
start-ssh \
ssh-keygen
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/authorized_keys.default:/system/etc/security/authorized_keys.default
上述拷贝的是ssh客户端的公钥,为什么要拷贝公钥呢?因为在android系统中不支持密码的方式登录,所以就用一个固定的公钥和私钥来登录。当用不同的客户端登录到服务端时,公钥已经默认放入到android系统中了(如上述的拷贝代码),再把保存好的公钥和私钥放入到客户端的.ssh文件夹中即可,这样也就不用去修改android设备里面的公钥了。
2、添加sshd服务
在device/rockchip/rk356x/init.rk356x.rx添加如下代码
service ssh_server /system/bin/start-ssh
class main
user root
group root system
disabled
oneshot
seclabel u:r:ssh_server:s0
on property:sys.boot_***plete=1
start ssh_server
添加上述代码后,sshd在开机时就会自启动。
3、为sshd服务添加selinux权限
在device/rockchip/***mon/sepolicy/vendor目录下创建ssh_server.te文件,输入如下内容:
type ssh_server, domain;
type ssh_server_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(ssh_server)
allow ssh_server system_file:file { getattr execute execute_no_trans map read open };
allow ssh_server self:capability { setgid };
allow ssh_server shell_exec:file { map read execute getattr };
allow ssh_server self:tcp_socket { a***ept getattr getopt setopt write read };
allow ssh_server fwmarkd_socket:sock_file { write };
allow ssh_server ***d:unix_stream_socket { connectto };
allow ***d ssh_server:fd { use };
allow ssh_server self:udp_socket { create };
allow ssh_server mnt_user_file:dir { search getattr };
allow ssh_server self:capability { sys_chroot setuid };
调试过程
1、将前面编译好的程序都push到设备的对应目录下
2、执行mkdir -p /data/ssh命令创建/data/ssh目录
3、执行start-ssh命令
在/data/ssh目录下将创建公钥和私钥文件
4、创建必要的目录和文件
mkdir -p /storage/run
mkdir -p /storage/run/ssh
mkdir -p /storage/run/ssh/empty
chmod 0600 /storage/run/ssh/empty
5、将客户端公钥放入服务端中
cat id_rsa.pub > /data/ssh/authorized_keys
chmod 0600 /data/ssh/authorized_keys
chown root:root /data/ssh/authorized_keys
6、启动sshd服务
执行start-ssh即可
7、客户端登录
1、生成私钥和公钥
ssh-keygen -t rsa -b 1024
2、ssh root@192.168.11.1登录即可
如下图所示
8、问题处理
如果出现如下问题
则删除客户端的.ssh目录下的known_hosts文件即可
参考资料
https://blog.csdn.***/hwq331717300/article/details/72270910