Windows 系统安装了 ssh 客户端,给 Ubuntu 安装了 ssh 服务器,这样就可以通过 ssh 在 Windows 和虚拟机 Ubuntu 之间传输文件。其实在开发板上也是可以移植和安装 ssh 服务器,这样就可以通过网络,在 Windows 和开发板之间传输文件,而不需用“串口文件传输工具”了,所以它需要网络,是wifi或者网线都可以的。
“ssh 服务器移植到开发板”,目标是能通过 ssh 在开发板在Windows 和开发板之间传输文件,当然也是可以使用 ssh 控制台。
这个实用性上是更加有用的,假如在实际的产品中,运行的是根文件系统,没有界面,如果数据需要在开发板和 Windows 传输数据,对于普通用户来说,是一个很好的选择,操作起来比较简单,只需要登陆然后直接将文件拖来拖去即可。
ssh 服务器需要依赖其他的库文件,所以需要先移植完成所有依赖的库文件,最后才能移植 ssh 服务器。
下面有两个openssl的地址,下载一个就可;
还需要下载zlib和ssh;
OpenssL 下载官网地址
OpenssL 的 github 下载地址
ssh 开源组织官网地址
zlib 官网地址
编译器使用“arm-2009q3
”。
我是在
“/home/project/ssh-arm/
”目录下,解压编译配置这三个需要移植的文件,用户如果在其
它目录下,配置文件需要根据实际情况修改,安装目录是“/home/project/ssh-arm/
”目录
下的“install
”文件夹,如下图所示
如下图所示,安装目录“install
”下新建两个文件夹“openssl-0.9.8h
”和“zlib-1.2.3
”,后面编译之后需要安装到这个目录下。
拷贝“zlib-1.2.3.tar.gz
”到 Ubuntu
系统,使用命令“tar -vxf zlib-1.2.3.tar.gz
”解
压,得到“zlib-1.2.3
”文件夹,使用命令“cd zlib-1.2.3
”进入“zlib-1.2.3
”文件夹。
接着使用命令“./configure --prefix=/home/project/ssh-arm/install/zlib-1.2.3
”,设置配置文件。
–prefix参数是设置安装路径
使用命令“vim Makefile
”修改编译参数,将所有 gcc 修改为“arm-none-linux-gnueabi-gcc
”。
使用编译命令“make
”。
在后面编译 SSH 的时候,需要用到 zlib
库,作者这里的路径是“/home/project/ssh-arm/install
”下后面配置的时候需要对应,生成的库文件
这部分移植其实就是修改了编译器,修改编译器之后编译出的文件和不修改编译出来的文
件是不一样的。在移植过程中,可能因为没有将寄存器配置为目标系统的编译器,那么编译出来的一定运行不了。这里可以通过 linux 的 strings 命令查看非文本文件中的可读内容,通常可以和 grep 命令搭配使用。
如下图所示,使用命令“strings -a /home/project/ssh-arm/install/zlib-1.2.3/lib/libz.a
”可以查看到所有可读信息,可读信息比较多,可以保存为文本再查看;
使用命令“strings -a /home/project/ssh-arm/install/zlib-1.2.3/lib/libz.a > log.my
”重定位一下输出即可。
这里需要用到的命令是“strings -a /home/project/ssh-arm/install/zlib-1.2.3/lib/libz.a | grep “GCC”
”。
如上图所示,可以看到编译器版本是“2009q3-67-4.4.1
”的,说明这个库是使用我们设
置的编译编译的,编译出的库文件当然也是 arm 上使用的。
或者使用file
命令来查看我们编译出来的库文件,可以看到ARM
,说明是在ARM
上面运行的。
接着来移植 openssl
库,拷贝“openssl-0.9.8h.tar.gz
”到 Ubuntu
系统,使用命令“tar -vxf openssl-0.9.8h.tar.gz
”解压,得到“openssl-0.9.8h
”文件夹,使用命令“cd openssl-0.9.8h
”进入“openssl-0.9.8h
”文件夹。
使用命令“./Configure linux-elf-arm -DB_ENDIAN linux:'arm-none-linux-gnueabi-gcc' --prefix=/home/project/ssh-arm/install/openssl-0.9.8h
”配置编译文件。
使用编译命令“make
”。
编译完成
和前面 zlib.a 类似,可以使用命令查看一下编译出来的文件到底有没有配置正确。
使用file
命令更方便些。
接着来移植 openssh
,拷贝“openssh-4.6p1.tar.gz
”到 Ubuntu
系统,使用命令“tar -vxf openssh-4.6p1.tar.gz
”解压,得到“openssh-4.6p1
”文件夹,使用命令“cd openssh-4.6p1/
”进入“openssh-4.6p1
”文件夹。
这里看一下 ssh
的 configure
的帮助文件,如下图所示,使用“ ./configure --help
”。
–host 表示编译出来要运行的平台;
–with-libs 表示需要的额外的库文件;
–with-zlib 表示库文件 zlib 的 instal 路径 l;
–with-ssl-dir 表示 OpenSSl 文件的 install 路径;
–disable-etc-default-login 表示不使用当前环境变量的编译器,所以后面配置参数时,最后直接配置 CC 和 AR 这两个编译器;
CC 表示设置使用的编译器;
AR 表示设置使用的编译器的路径;
使用配置命令,命令比较长:
./configure --host=arm-none-linux --with-libs
--with-zlib=/home/project/ssh-arm/install/zlib-1.2.3
--with-ssl-dir=/home/project/ssh-arm/install/openssl-0.9.8h
--disable-etc-default-login
CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc
AR=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-ar
这个是写在一行的,我把他拆开,大家路径要根据自己的情况来修改。
编译完成,最后肯定是需要安装到开发板上的,如下图所示。最后在目录下“/home/project/ssh-arm/openssh-4.6p1
”有这几个二进制文件“scp
、sftp
、ssh
、sshd
、ssh-add
、ssh-agent
、ssh-keygen
、ssh-keyscan
”需要安装到开发板上。最终编译出来的二进制文件,可以使用 file
命令查看文件属性,如下图所示,使用命令“file scp
”,可以看到“scp
”文件是 32 位 ARM 上使用的可执行文件。
基本文件的安装,在开发板上新建“/usr/libexec
“、“/usr/local/etc
”、“/usr/local/bin
”三个目录,使用命令“mkdir -p /usr/libexec /usr/local/etc /usr/local/bin
”。
在虚拟机 Ubuntu
上,将 openssh-6.6p1
下的生成“scp 、sftp、ssh、sshd、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan
”可执行文件拷贝到开发板的“/usr/local/bin
”目录下,拷贝完成。
将“moduli
、ssh_config
、sshd_config
”拷贝到开发板的“/usr/local/etc
”目录下,拷贝完成。
将“sftp-server
、ssh-keysign
”拷贝到开发板的“/usr/libexec
”目录下。
key
文件,并安装。使用“ssh-keygen
”生成是个 key
文件“ssh_host_rsa_key
” “ssh_host_dsa_key
”“ssh_host_ecdsa_key
”和“ssh_host_ed25519_key
”。
在虚拟机 Ubuntu
控制台,“/home/project/ssh-arm/openssh-4.6p1
”目录下,使用命令“ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
”,可以生成“ssh_host_rsa_key
”文件。
接着使用剩下的三条命令:
ssh-keygen -t dsa -f ssh_host_dsa_key -N "" ssh-keygen -t
ecdsa -f ssh_host_ecdsa_key -N "" ssh-keygen -t dsa -f
ssh_host_ed25519_key -N ""
执行完成之后,生成的文件。
将生成的“ssh_host_rsa_key
”“ssh_host_dsa_key
”“ssh_host_ecdsa_key
”和 “ssh_host_ed25519_key
”文件,拷贝到开发板的“/usr/local/etc/
”目录,然后将其权限修改为 600
。
在开发板串口控制台中,使用命令“vi /etc/passwd
”,打开 ssh 秘钥文件,在“/etc/passwd
”文件底行添加以下内容:
sshd:x:74:74:Privilege-separated
SSH:/var/empty/sshd:/sbin/nologin
添加完成之后,保存。
开发板链接路由器,PC 机的 Windows 系统也是链接路由器,所以首先要确保开发板和 PC 机是可以 Ping 通的。
PC 的 IP 为:192.168.2.12
开发板的 IP 为:192.168.2.230
使用 ping
命令测试,如下图所示,网络通畅,另外按键“Ctrl”+c 可以结束 ping
动作。
接着在开发板上新建 root
账户,如下图所示,使用命令“passwd root
”,它会提示输入密码,需要重复输入两次以防输错。
在开发板上运行 sshd
二进制文件,使用命令“/usr/local/bin/sshd
”,虽然报错了,但是不影响使用。如果提示缺少动态库,前面的库文件如果拷贝不全,可能出现这种问题,一般是不会提示缺少什么库的。
接着使用“ps
”命令,查看一下 sshd
是否在运行,如下图所示,可以看到 sshd
已经运行了。
最后使用windows的shell来连接开发板,就和连接ubuntu是一样的。
或者在ubuntu中安装ssh服务,然后连接到开发板上也是可以的。
→→编译好的库文件连接,可以直接使用
这里ssh的完整移植就结束了。到这里,部分用户可能会有疑惑,第一个人是如何知道 ssh 需要这两个库文件的呢?首先,开发 ssh 软件的大神,做了这个东西会提供编译和使用 demo,这样就有了基础的英文移植文档,然后慢慢的会有中文版的,接着 ssh 流传开了之后,通过网络搜索 ssh 移植到 arm的方法的文档和博客,就随处可见了。
当然,假如将来大家工作有移植的需求,找不到中文教程,需要直接使用某个开源软件的demo,首先就需要英文过关,然后还需要有移植的基础知识。在编译的过程中,它会提示缺少各种库,通过编译,也是可以一步一步找出依赖库的。