嵌入式平台ssh开发环境搭建

Posted kn-zheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式平台ssh开发环境搭建相关的知识,希望对你有一定的参考价值。

为了传输文件和远程控制的方便,目前要给fsl imx6开发板移植SSH环境。

OpenSSL 可以为 OpenSSH 提供加密传输支持,是 OpenSSH 的一个中间件)版本和 Zlib (提供压缩传输支持)版本

SSH协议族可以用来进行远程控制, 附加的SFTP协议可轻松实现在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,因为它们使用明文传送密码。
OpenSSH常常被误认以为与OpenSSL有关联,但实际上这两个计划的有不同的目的,不同的发展团队,名称相近只是因为两者有同样的软件发展目标──提供开放源代码的加密通讯软件。

可直接下载使用我编译好的SSH环境,避免自己去编译:

下载链接:

下载之后使用方式:

下载压缩包后解压得到:
  • 1


拷贝上述目录拷贝至开发板/usr目录下,然后参照本文后面‘移植至嵌入式板子过程’配置下环境即可。

一、下载源码

Zlib源码下载链接
https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz

OpenSSL源码下载链接
https://www.openssl.org/source/openssl-1.0.2q.tar.gz

OpenSSH源码下载链接
ftp://mirror.internode.on.net/pub/OpenBSD/OpenSSH/portable/openssh-7.9p1.tar.gz

因为它们之间没有版本所谓的版本冲突,所以都下载最新版的即可。我搭建imx6可以用的ssh环境使用的如下源码:zlib-1.2.11.tar.gz、openssl-1.0.2q.tar.gz、openssh-7.9p1.tar.gz,其他版本过程一样。

二、部署

1、创建工作目录:
mkdir -p /home/eric/SelfCompile/SSH
2、在/work目下面创建安装、解压目录

cd /home/eric/SelfCompile/SSH
mkdir decompressed install
//install 软件安装目录 【tag:最终make出来的ssh并不是在install目录,而是在openssh源码目录。但是未了管理的一致性,还是创建次install目录】
//decompressed 源码包解压目录

3、解压安装包:
tar zxvf zlib-1.2.11.tar.gz –C …/decompressed
tar zxvf openssl-1.0.2q.tar.gz –C …/decompressed
tar zxvf openssh-7.9p1.tar.gz –C …/decompressed

三、配置&编译Zlib

./configure --prefix=/opt/ssh_arm32/ssh 【前面有CC、AR之类的配置反而configure会出错】

按如上配置后,会生成Makefile

生成的Makefile中已经是交叉编译工具链对应的编译器,故不需要再修改。然后:

make
sudo make install

最终生成的如下

第2次编译——修改路径至eric路径,避免使用root账号

./configure --prefix=/home/eric/SelfCompile/SSH/install

四、配置&编译OpenSSL

./Configure --prefix=/home/eric/SelfCompile/SSH/install os/compiler:arm-poky-linux-gnueabi-gcc
OpenSSL虽然源码中解压后自带有Makefile,但是CC等不是交叉编译的。故需要导入交叉编译的配置。导入配置指令如上,跟Zlib核OpenSSH导入配置不一样;

导入完之后的Makefile如下:下面的CC要去掉arm-poky-linux-gnueabi-,因为重复了,导致编译出错。

之后make成功,但是sudo make install时报找不到arm-poky-linux-gnueabi-ranlib。原因就是:sudo切换到root账户下去make install时,root账户下面的arm-poky-linux-gnueabi-ranlib环境变量没有配好(看PATH变量可以发现没有arm-poky-linux-gnueabi-ranlib对应的路径)。所以干脆–prefix=/home/eric/SelfCompile/SSH/install,这样就不需要sudo make install了。

最终make install成功

五、配置&编译OpenSSH

不依赖ZLib和OpenSSL时编译
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as CC=arm-poky-linux-gnueabi-gcc ./configure -cache-file=cache0 --host=arm-poky-linux --prefix=/opt/ssh_arm32/ssh CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi"

LDFLAGS=-L/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/lib 【加上此LDFLAGS,后面还是报找不到部分库和.o文件】

按上述进行配置生成makefike没有报错;

Make编译

编译报上述错误,但是实际上交叉编译工具链的某些目录下存在上述文件,不知道为啥还报错。
原因:上述文件的链接路径没有指向正确。如果将上述.o和.so拷贝到当前编译的工程目录下。则不会报上述错误。所以,解决的方式是,将上述.o和so文件的路径指定正确。

arm-poky-linux-gnueabi-ld -o ssh ssh.o readconf.o clientloop.o sshtty.o sshconnect.o sshconnect2.o mux.o -L. -Lopenbsd-compat/ -Wl,-O1 -Wl,–hash-style=gnu -Wl,–as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -pie -lssh -lopenbsd-compat -lcrypto -ldl -lutil -lz -lcrypt -lresolv

arm-poky-linux-gnueabi-gcc -o ssh ssh.o readconf.o clientloop.o sshtty.o sshconnect.o sshconnect2.o mux.o -L /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/lib:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/lib/arm-poky-linux-gnueabi/5.3.0 -Lopenbsd-compat/ -Wl,-O1 -Wl,–hash-style=gnu -Wl,–as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -pie -lssh -lopenbsd-compat -lcrypto -ldl -lutil -lz -lcrypt -lresolv

但弄了好久还是出现找不到一些库和.o文件。尤其是-lgcc,交叉编译环境下没有此库。

依赖Zlib和OpenSSL之后重新编译
之前编译OpenSSH,不依赖依赖Zlib和OpenSSL库,编译报上述错误。现在尝试依赖这2个工程编译出的库。后来编译通过,说明编译OpenSSH是必须依赖Zlib和OpenSSL库才行。

配置:
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as CC=arm-poky-linux-gnueabi-gcc ./configure --host=arm-poky-linux --prefix=/home/eric/SelfCompile/SSH/install --with-libs --with-zlib=/opt/ssh_arm32/ssh/zlib --with-ssl-dir=/home/eric/SelfCompile/SSH/install/openssl --disable-etc-default-login

【后来发现:按上述–prefix=/home/eric/SelfCompile/SSH/install 导致最终板子上运行sshd时跑去上述路径去找依赖,而板子上肯定是没有这个eric账号路径的。实际上是不需要配置–prefix。默认/usr路径即可】

故用imx6交叉编译环境最终可行的配置是:
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as CC=arm-poky-linux-gnueabi-gcc ./configure --host=arm-poky-linux --with-libs --with-zlib=home/eric/SelfCompile/SSH/install/zlib --with-ssl-dir=/home/eric/SelfCompile/SSH/install/openssl --disable-etc-default-login

Make编译:
出现如下错误

对应Makefile中出错位置如下:

原因及解决方式:
由于我们是交叉编译的文件,而在make install时使用的strip不是交叉编译版的,所以不能正解执行。网上找了一圈也是只能注释掉Makefile中的STRIP_OPT=-s这一选项。后来自己man install时看到有个”–strip-program”的选项,尝试了下将STRIP_OPT=改为如下,再make install时此错误就消息了。

STRIP_OPT=-s --strip-program=arm-none-linux-gnueabi-strip 【有效】

https://blog.csdn.net/flfihpv259/article/details/51601403

之后接着make install【不需要这一步】

实际上不需要make install。 如上,ssh-keygen等文件是arm32的,直接拷贝到嵌入式板子上即可。不需要make install

六、移植至嵌入式板子过程

移植时不需要另外移植Zlib、OpenSSL编译出的内容。只需要拷贝OpenSSH编译出的东西即可。移植OpenSSH的过程如下:

创建目录
确保开发板上有以下目录,若没有,则新建:
/usr/local/bin
/usr/local/etc
/usr/libexec
/var/run
/var/empty/sshd

拷贝生成的文件至开发板

将 openssh目录下文件拷贝到开发板系统中,具体为:
scp、sftp、ssh 、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan共7个文件拷贝到开发板/usr/local/bin

moduli、ssh_config、sshd_config共3个文件拷贝到开发板 /usr/local/etc

sftp-server、ssh-keysign 共2个文件拷贝到开发板 /usr/libexec

sshd 拷贝到/usr/sbin

【前面openssh configure时不要带–prefix时,则ssh make之后默认到板子/usr路径】

生成key

在虚拟机/home/eric/SelfCompile/SSH/decompress/openssh-7.9p1路径下执行一下操作:

ssh-keygen -t rsa -f ssh_host_rsa_key -N “”
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_ed25519_key 权限为 600:

$ chmod 600 ssh_host_ed25519_key

其中 ssh_host_ed25519_key 是SSH第二版协议用到的key,需要修改权限,否则会提示以下错误:
Permissions 0644 for ‘/usr/local/etc/ssh_host_ed25519_key’ are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /usr/local/etc/ssh_host_ed25519_key
Could not load host key: /usr/local/etc/ssh_host_ed25519_key

将生成的 ssh_host_* 8个文件copy到目标板的 /usr/local/etc/目录下(含有.pub文件)

这里有很重要的一件事要做,在你的开发板中执行一下命令:这一步如果没做SSH移植就无法成功,该步骤困扰我很长时间。

chmod 700 /usr/local/etc/*

如果你没进行上述操作就会出现大量的如下图的错误

添加用户
修改目标板根文件系统/etc目录下【注意不是安装路径/usr/local/etc这个目录】的 passwd 和group文件,添加上sshd用户和组,步骤如下:

cd /etc
vi passwd

//在文件末尾添加一下内容并保存退出:
sshd:*:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin1

vi group
//添加
sshd:*:74:

修改sshd_config
修改sshd_config文件如下选项,其他按默认配置:

HostKey for protocol version 1
HostKey /usr/local/etc/ssh_host_key
HostKeys for protocol version 2
HostKey /usr/local/etc/ssh_host_rsa_key
HostKey /usr/local/etc/ssh_host_dsa_key

PermitRootLogin yes #――允许根用户登陆
PermitEmptyPasswords yes #――允许使用空密码,即不需要密码
UsePrivilegeSeparation no #――把安全级别降低,因为不会连接互联网

override default of no subsystems
Subsystem sftp /usr/local/libexec/sftp-server #――指定sftp服务路径,否则将不能启动sftp服务,将不能进行文件的上传和下载

注意事项(开发板上操作)
1、/打开开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉。
如果开发板的 root 用户还没有密码,键入以下命令然输入两次密码来修改,否其他设备无法连:
$ passwd root
密码更改失败,查询/etc/目录下是否有shadow文件夹,没有请创建

设置SSH开机自动启动

重启开发板之后,发现ssh 失败了,原因是因为sshd 服务没有启动,需要在/etc/init.d/rcS 中添加一行,设置为开机启动
/usr/sbin/sshd

SSH登录方式
注意:能远程登陆的前提是, 嵌入式板子IMX6和主机需在同一个局域网内;

Linux系统下:
ssh root@192.168.1.111 即可登录

我windows上VirtualBox下的Ubuntu 配置的网络地址转换(NAT)。可以直接用上述命令远程登陆上IMX6。

Windows系统下:
用SSH Secure Shell Client等SSH连接终端;

碰到的问题

ssh-keygen -R——板子上是ssh server修改配置后主机再次连接报如下问题:

按上面提示删掉即可:
ssh-keygen -R [服务器ip address]

登录SSH问题-Permission denied, please try again.

我们往下拖拖,找到如下行数:

我们可以看到,这几行默认不允许root登录SSH,所以我们要进行相应设置,sshd_config修改配置如下:
Authentication:
LoginGraceTime 120
#PermitRootLogin without-password
PermitRootLogin yes
StrictModes yes
OK,此时就允许root登录ssh了

https://www.cnblogs.com/yixius/articles/6971054.html

ssh client 报 algorithm negotiation failed的解决方法

https://www.kuanxu.com/server/debian/9.html

修改嵌入式板子上sshd的配置文件 /usr/local/etc/sshd_config
在sshd_config配置文件中添加:

Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc

MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96

KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org

重启sshd服务后,即可正常连接。

参考文章

成功移植 SSH 服务到 ARM 开发板上
https://blog.csdn.net/xy010902100449/article/details/50343733 【重点】

arm开发板 移植SSH操作说明
https://blog.csdn.net/u013711616/article/details/53044918

ARM交叉编译搭建SSH-Server至目标板
https://blog.csdn.net/gubenpeiyuan/article/details/32325691

SSH 成功移植到 ARM 平台
https://blog.csdn.net/hpu11/article/details/78808142

http://www.talkwithtrend.com/Article/39407

https://blog.csdn.net/xjmbufan/article/details/83099398

https://blog.csdn.net/lell3538/article/details/51769840 【很好】

嵌入式4412开发平台Android系统开发环境搭建以及编译

本文介绍 ubootLinux3.0.15 和 linux-3.5 内核、Android4.0.3 Android4.2.2 编译环境的搭建以及编译。

 技术分享

详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com

UbootKernel 以及 Android 的编译环境看似复杂,用户只要抓住以下几个要点就可以
了:
第一:UbootKernel 编译器。编译器在光盘中都有提供,在需要使用的步骤中,会说
明编译器在光盘中的位置。
第二:设置环境变量。UbootKernel 编译器的环境变量设置后,编译的时候,系统才
能找到编译器。
第三:Android 文件系统的编译器。编译器需要使用 Ubuntu 系统自带的 gcc 编译器,
但是版本不对,所以需要降低版本。迅为将这个过程编写了成几个简单的命令,用户只需要挨个执行命令就可以了。
第四:库文件。搭建过程中会给通过执行简单的脚本命令来安装库文件,复杂的步骤变的
简单有效。

 

另外,如果用户想了解编译环境具体是怎么搭建起来的,可以利用我们提供的脚本文件来
学习。

 

Android4.0.3编译环境的两种搭建方式
迅为电子给用户提供两种搭建编译环境的方式,一种方法是用户安装虚拟机,然后安装基
础的 Ubuntu12.04.2 系统,利用我们提供工具和详细的使用步骤,搭建编译环境;另外一种方法是用户安装虚拟机,然后直接加载我们“搭建好的 Ubuntu 镜像”,用户只需要修改一下编译器的环境变量,就可以直接用来编译源码。

 

1.  自己搭建环境
自己安装虚拟机,安装 Ubuntu12.04.2 系统,搭建环境。
2.   搭建环境
如何搭建编译环境,这里需要注意的是,搭建过程中用到的各类软件,都需要和手册提到的版本保持一致,如果使用的是“搭建好的镜像”,则可以跳过这一节,但是编译的时候要针对性的设置一下环境变量。

 

3.  安装基本软件
首先安装虚拟机Vmware_Workstaion_wm”,然后使用虚拟机安装“Ubuntu12.04.2
初始系统”。
Ubuntu 的安装方法可以参考 3.2 小节来安装 Ubuntu12.04.2 原始系统,如下图所示,
Ubuntu 初始系统安装完成。

 

<ignore_js_op>技术分享

 

输入密码topeet”,登陆 Ubuntu,键盘上按“Ctrl+Alt+t,弹出 Ubuntu 的控制
台。如下图所示。

 

<ignore_js_op>技术分享

 

安装完成后进入 Ubuntu 的终端,激活 root 用户,具体操作如下。

 

 Ubuntu 命令行中,执行命令“sudo passwd root”。
接着在 Ubuntu 的终端输入安装时的密码和新密码,Ubuntu 系统中密码默认是隐藏的。
如下图所示。

 

<ignore_js_op>技术分享



接着登录 root 用户,具体操作如下。
 Ubuntu 命令行中,执行命令“su root”。
接着输入密码,就可以登陆 root 用户。
后面所有的操作都需要在 root 用户下面进行操作,如下图所示。

 

<ignore_js_op>技术分享

 

虚拟机 VMware-workstation8.0.3 联网
修改数据源地址, Ubuntu 数据源地址修改为国内地址。

 

更新数据源。
然后在 Ubuntu 安装软件 vim 和 ssh,在 Ubuntu 命令行中,执行命令“apt-get install
vim”和“apt-get install ssh”。
上面安装的 ssh 软件,可以很方便在主机和虚拟机上传递文件,也可以通过远程终端控制
Ubuntu 系统,这里推荐给大家使用。



安装编译组件
交叉编译工具
编译的时候需要用到交叉编译工具,我们提供的交叉编译工具是用户光盘02_编译器以
及烧写工具”→“arm 交叉编译器”文件夹中的压缩包“arm-2009q3.tar.bz2”。

 

<ignore_js_op>技术分享

 

使用 SSH 工具将交叉编译工具拷贝到 Ubuntu12.04.2 系统的文件夹“usr-->local-->arm”中,local 下默认没有 arm文件夹,可以新建一个。如下图所示。

 

<ignore_js_op>技术分享

 

拷贝编译器之后如下图所示。

 

<ignore_js_op>技术分享
然后在 Ubuntu 系统中将压缩包解压到当前目录下。
使用命令cd /usr/local/arm/”进入/usr/local/arm文件夹,然后使用解压命令“tar -vxf arm-2009q3.tar.bz2”解压压缩包,如下图所示。
<ignore_js_op>技术分享
修改交叉编译工具的路径(修改环境变量)
修改交叉编译工具路径,需要修改环境变量。在 Ubuntu 命令行中,执行命令“cd
/root”和“vim .bashrc”,打开环境变量文件“.bashrc”,如下图所示。



<ignore_js_op>技术分享
然后在.bashrc”文件中的最后一行添加如下信息:
export PATH=$PATH:/usr/local/arm/arm-2009q3/bin
如下图所示。

 

<ignore_js_op>技术分享

 

修改完成后保存退出。
执行下列命令,更新环境变量source .bashrc”的命令,如下图所示。

 

<ignore_js_op>技术分享

 

最后,在 Ubuntu 命令行中输入命令“arm”,然后按 TAB 键,如果在命令行中能够看
 arm 编译器的信息,就表明交叉编译工具安装成功。如下图所示。
<ignore_js_op>技术分享
安装库文件、JDK以及降低GCC版本        
为了方便用户,将库文件和 JDK 的安装命令制作成了脚本文件,用户只要执行两个脚本
就可以安装库文件和 JDK。这两个脚本在用户光盘“02_编译器以及烧写工具”→“tools”文件夹下的压缩包“Android_JDK.tar.bz2”中,如下图所示。
<ignore_js_op>技术分享

 

用户将压缩包拷贝到 Ubuntu 系统中,解压压缩包会生成文件夹“Android_JDK”,如
下图所示。

 

<ignore_js_op>技术分享

 

安装库文件和 JDK
使用 cd 命令,进入解压出来的“Android_JDK” -->jdk6”文件夹,运行脚本文件
install-sun-java6.sh”。
需要注意的是,这条命令执行完毕可能会耗时 15 分钟以上。
如下图所示,执行./install-sun-java6.sh”脚本。
<ignore_js_op>技术分享

 

执行上面的命令的时候,根据提示输入“回车”命令。升级完成之后如下图所示。

 

<ignore_js_op>技术分享

 

进入解压出来的文件夹Android_JDK”中运行脚本“install-devel-packages.sh”,安
装库文件。在 Ubuntu 命令行中,执行命令“./install-devel-packages.sh”,需要注意的
是,这条命令可能会耗时 40 分钟以上,如下图所示。

 

<ignore_js_op>技术分享
上面命令执行的时候,需要根据提示输入Y”。

 

<ignore_js_op>技术分享

 

然后安装过程中,还会提示输入y”,如下图所示
<ignore_js_op>技术分享

 

如下图所示,安装完毕。

 

<ignore_js_op>技术分享

 

这里需要注意的是,上面这个脚本执行完毕的时候,注意一下有些库文件是不是提示没有
安装。如果发现有库文件没有安装,有可能是网络不好或者下载源丢失。这个时候用户使用一
下更新下载源的命令apt-get update“,然后再执行一下上面的两个脚本。
例如,如下图所示,再次运行./install-devel-packages.sh”之后,提示没有无法安装
的库和软件,那么表明已经安装完全了。
<ignore_js_op>技术分享
降低 GCC版本
使用 Ubuntu 编译 Android 的时候需要用到 Ubuntu 系统自带的 GCC4.4.7 编译器,但
是安装的 Ubuntu12.04.2 版本,它的 GCC版本过高,所以这里需将要 GCC编译的版本降低
 4.4.7
进入前面解压的文件夹Android_JDK”中,会看到一个文本“update_gcc.txt”,打开
文本update_gcc.txt”后会看到里面有 条命令,这 条命令需要在 Ubuntu 命令行中依
次执行。如下图所示,使用命令打开update_gcc.txt”文件。
<ignore_js_op>技术分享
如下图所示,有 8 条命令。
<ignore_js_op>技术分享
例如执行第一条命令。
<ignore_js_op>技术分享
根据提示输入y”,如下图所示。
<ignore_js_op>技术分享
其余几条命令,如下图所示,执行起来很快。
<ignore_js_op>技术分享



在执行了这 8 条命令之后,Ubuntu 系统就将 gcc 的版本降低到 4.4.7
如下图所示,使用命令gcc -v”,可以看到 gcc 的版本为 4.4.7 了。
<ignore_js_op>技术分享
 

 

需要注意的是,在执行这 8 条命令时,只有第一条命令会耗时 10 分钟左右,其它的都会
很快完成,而且命令一定要依次执行,不能有遗漏

 









以上是关于嵌入式平台ssh开发环境搭建的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式ARM开发环境搭建

嵌入式ARM开发环境搭建

请问用Linux做一个操控的嵌入式系统,怎么搭建平台好?

搭建S3C6410开发板的测试环境

PIC单片机开发环境的搭建总结及新上手单片机平台如何实现快速开发的几点经验分享

一CC2530开发环境搭建