由于OpenSSH因为其相对较大,一般不太适用于嵌入式平台,多用于PC或者服务器的Linux版本中。而Dropbear是由Matt Johnston所开发的Secure Shell软件(包括服务器端与客户端)。期望在存储器与运算能力有限的情况下取代OpenSSH,Dropbear特别用于“嵌入”式的Linux(或其他Unix)系统,如无线路由器。
由于dropbear依赖zlib的库所以在编译dropbear之前需要先编译zlib
(1)编译zlib
$ tar -xvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure --prefix=/home1/out/zlib
(2)修改生成的Makefile
CC=powerpc-none-linux-gnuspe-gcc
LDSHARED=powerpc-none-linux-gnuspe-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=powerpc-none-linux-gnuspe-gcc -E
AR=powerpc-none-linux-gnuspe-ar
RANLIB=powerpc-none-linux-gnuspe-ranlib
修改后进行make和make install
(3)编译dropbear
编译之前我们需要先修改下dropbear的源码,由于后期我们需要给dropbear添加sftp-server ,但是dropbear的模式访问sftp-server的路径是/usr/libexec,也就是说后期编译生成的sftp-server必须放到这个目录dropbear才访问的到,但是目前项目的这个usr目录都被用来存放业务的代码了,所以现在必须将其默认路径修改掉
diff --git a/dropbear-2018.76-m/default_options.h b/dropbear-2018.76-m/default_options.h
index 86fb25a1..f8bb9218 100755
--- a/dropbear-2018.76-m/default_options.h
+++ b/dropbear-2018.76-m/default_options.h
@@ -250,7 +250,7 @@ Homedir is prepended unless path begins with / */
* OpenSSH), set the path below and set DROPBEAR_SFTPSERVER.
* The sftp-server program is not provided by Dropbear itself */
#define DROPBEAR_SFTPSERVER 1
-#define SFTPSERVER_PATH "/usr/libexec/sftp-server"
+#define SFTPSERVER_PATH "/bin/sftp-server"
/* This is used by the scp binary when used as a client binary. If you're
* not using the Dropbear client, you'll need to change it */
diff --git a/dropbear-2018.76-m/default_options_guard.h b/dropbear-2018.76-m/default_options_guard.h
old mode 100755
new mode 100644
index 77cae78c..858d8f19
--- a/dropbear-2018.76-m/default_options_guard.h
+++ b/dropbear-2018.76-m/default_options_guard.h
@@ -385,7 +385,7 @@ Homedir is prepended unless path begins with / */
#define DROPBEAR_SFTPSERVER 1
#endif
#ifndef SFTPSERVER_PATH
-#define SFTPSERVER_PATH "/usr/libexec/sftp-server"
+#define SFTPSERVER_PATH "/bin/sftp-server"
#endif
将这两个文件下的默认宏定义路径修改了
$ ./configure CC=powerpc-none-linux-gnuspe-gcc --host=powerpc-none-linux-gnuspe --prefix=/home1/out/dropbear/ --with-zlib=/home1/out/zlib
$ make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
$ make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
–with-zlib : 指定依赖的库文件存放路径
–prefix :指定安装路径
(4)移植进开发板
将dropbear编译安装生成的文件放入开发板中
$ cd /home1/out/dropbear/
$ cp bin/* sbin/* /home1/rootfs/bin
在开发板上进行操作
$ cd /etc/
$ mkdir dropbear # dropbear 默认访问ssh钥 路径
$ dropbearkey -t rsa -f dropbear_rsa_host_key
$ dropbearkey -t dss -f dropbear_dss_host_key
会在改目录下生成两个ssh 公钥文件 将其复制到根文件系统同目录下,这样就不需要每个新板子都执行以上操作,文件权限为600
注意:记得将依赖库一并放入开发板中
$ powerpc-none-linux-gnuspe-readelf -d 文件命 # 查看文件依赖库
$ cp -L 文件命 # 保证文件链接属性复制
(5)测试
将其烧录到开发板子,执行以下操作
# 执行dropbear
$ dropbear &
# 查看是否有dropbear默认端口为22
$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::22 :::* LISTEN 1477/dropbear
# 是用ssh 测试是否能够登陆
$ ssh 用户名@ip
$ passwd
在板子内添加dropbear后虽然可以使用ssh登陆开发板了,但是dropbear本身不支持使用sftp上传和下载文件,需要给dropbear添加sftp-server,sftp-server是属于openSSH里的一个功能,所以我们需要编译oenSSH
由于openSSH依赖zlib和openSSL库我们需要先编译这两个
(1)编译openSSL
$ ./config no-asm shared --prfix=/home1/out/openssl/
no-asm : 表示在交叉编译过程中不适用汇编代码加速编译过程,原因是它的汇编代码对arm格式的不支持
shared : 表示编译生成动态库由于我们主要是为了编译openSSH,而openSSH依赖openSSL的动态库如果使用了静态编译那么在编译openSSH的时候就会由于找不到动态库而报错
(2)修改Makefile
CROSS_COMPILE=powerpc-none-linux-gnuspe-
# 删除makefile中所有的 -m64
之后进行 make 和 make install
(3)编译openSSH
$ ./configure CC=powerpc-none-linux-gnuspe-gcc --with-libs --host=powerpc-none-linux-gnuspe --prefix=/home1/out/openssh/ --with-zlib=/home1/out/zlib --disable-etc-default-login --with-ssl-dir=/home1/openssl/openssl-1.1.1m
$ make sftp-server # 我们只需要编译sftp-server,不需要make install
$ cp sftp-server /home1/rootfs/bin
(4)移动文件到跟文件系统
由于在编译安装dropbear的时候将其关于sftp-server的默认路径修改成立/bin/sftp-server 所以我们需要将编译出来的sftp-server移动到改目录下,并保证依赖库都移植到了开发板中
$ powerpc-none-linux-gnuspe-readelf -d sftp-server # 查看依赖库
(5)在开发板中加入开启自启动脚本
$ vi /etc/init.d/rcS
#!/bin/sh
#Run general init for all platforms
[ -x /etc/init.d/common.sh ] && . /etc/init.d/common.sh
#Run platform-related init
#[ -x /etc/init.d/platform.sh ] && /etc/init.d/platform.sh
#Try to run app,must run background,so init can run inetd.
if [ -f /etc/scripts/start.sh ]; then
# chmod 777 /etc/scripts/start.sh
/etc/scripts/start.sh &
else
echo "Can't find /etc/scripts/start.sh!"
fi
if [ -f /etc/init.d/sftp.sh ]; then # 添加sftp的开启脚本
/etc/init.d/sftp.sh &
else
echo "Can't find /etc/init.d/sftp.sh!"
fi
$ vi sftp.sh
#!/bin/sh
base=dropbear
$base
这样每次开机就会自动运行dropbear应用了,测试发现,只要支持了sftp-server,直接终端敲入dropbear就可以了,关闭dropbear命令killall dropbear
(6)测试
使用带有sftp协议的文件传输软件测试传输能力,这里我们使用的是FileZlia
发现可以正常连接和传输文件,移植成功,