OpenSSH移植到ARM Linux教程

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

1 下载

1、移植openssh需要三个包:openssh、openssl 和 zlib,地址如下:

因为它们之间没有版本所谓的版本冲突,所以都下载最新板的即可。本文以zlib-1.2.8.tar.gzopenssl-1.0.1h.tar.gzopenssh-6.6p1.tar.gz这三个版本为例,其他版本过程一样。

2 部署

因为移植过程涉及到三个包,所以先部署好工作目录,有利于移植过程的顺利进行。

$ cd                                                 # 切换到用户目录
$ mkdir ssh                                          # 新建 ssh 工作目录
$ cd ssh                                             # 进入 ssh 目录  
$ mkdir zlib.install                                 # 新建 zlib 安装目录,移植过程 zlib 镜像会安装到该目录
$ mkdir openssl.install                              # 新建 openssl 安装目录,移植过程 openssl 镜像会安装到该目录
$ export PATH=$PATH:/usr/local/arm-2010q1/bin/       # 配置交叉编译器路径到 PATH 环境变量

3 复制解压

将 zlib-1.2.8.tar.gzopenssl-1.0.1h.tar.gzopenssh-6.6p1.tar.gz 三个源码包复制到ssh目录下,并解压:

$ tar zxvf zlib-1.2.8.tar.gz
$ tar zxvf openssl-1.0.1h.tar.gz
$ tar zxvf openssh-6.6p1.tar.gz

4 交叉编译 zlib

首先编译zlib成镜像,供最后编译 openssh 用。

$ cd zlib-1.2.8
$ prefix=/home/veryarm/ssh/zlib.install CC=arm-none-linux-gnueabi-gcc ./configure
$ vi Makefile
$ make
$ make install

这里第二部配置的时候,prefix前面没有“--”,CC后面是交叉编译器,“./configure”要放在最后。完成后,会在指定目录“/home/veryarm/ssh/zlib.install”下生成镜像文件。

5 交叉编译openssl

编译 openssl 成镜像,也是供最后编译 openssh 用。

$ cd ../openssl-1.0.1h
$ ./Configure --prefix=/home/veryarm/ssh/openssl.install  os/compiler:arm-none-linux-gnueabi-gcc
$ make
$ make install

其中./Configure第一个字母是大写的,交叉编译使用os/compiler来指定。

6 交叉编译openssh

编译openssh会引用上面编译的zlib和openssl的安装目录,如下。
$ cd  ../openssh-6.6p1
$ ./configure --host=arm-none-linux-gnueabi --with-libs --with-zlib=/home/veryarm/ssh/zlib.install --with-ssl-dir=/home/veryarm/ssh/openssl.install --disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
$ make

注意:openssh不需要 make install。

7 目标板准备

确保目标板上有以下目录,若没有,则新建:

/usr/local/bin
/usr/local/etc
/usr/libexec
/var/run
/var/empty
将PC机 /home/veryarm/ssh/openssh-6.6p1/ 目录下文件拷贝到目标板系统中,具体为:
  • scp、sftp、ssh sshd、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan共8个文件拷贝到目标板/usr/local/bin
  • moduli、ssh_config、sshd_config共3个文件拷贝到目标板 /usr/local/etc
  • sftp-server、ssh-keysign 共2个文件拷贝到目标板 /usr/libexec

8 生成Key文件

在目标版 /usr/local/etc/ 目录下生成key文件:

$ cd /usr/local/etc/
$ 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

9 目标板用户信息

打开 /etc/passwd 文件,在最后添加下面这一行:

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

如果开发板的 root 用户还没有密码,键入以下命令然输入两次密码来修改,否其他设备无法连:

$ passwd root

10 测试

在目标板上运行:

$ /usr/local/bin/sshd

可以用 ps 命令查看sshd是否在工作。

如果运行的过程中有提示缺少动态连接库,可以在主机上搜索相应文件,拷贝到目标板/lib/目录下面,注意创建软连接!
OK!不出意外的话可以成功,

主机上:

$ ssh root@192.168.1.250(开发板的ip)
然后输入开发板的root密码就就可以了。
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (27)

  1. 运行sshd时出现sshd: /lib/libc.so.6: version `GLIBC_2.7' not found (required by sshd)
    Wincom 3年前 (2014-11-11) 回复 编辑
    • 说明你编译等时候指定等glibc和目标板所使用的不一致。 解决办法:配置openssh,即./configure时,使用对用等--host参数,如--host=arm-linux,或者--host=arm-none-linux-gnueabi。
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  2. make openssl的时候,指定的prefix目录已经存在,无法创建。
    Niki 3年前 (2014-11-11) 回复 编辑
    • 这是因为在prefix目录的时候,使用了相对路径,如../../install。 解决办法:prefix参数需要用指定绝对路径来安装,prefix参数应该如:--prefix=/work/ssh/install/openssl-1.0.0
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  3. 使用arm-2007q3-51-arm-none-linux-gnueabi.bin的make编译ssh时出错: /root/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s collect2: ld returned 1 exit status make: *** [example] 错误 1
    美丽石头 3年前 (2014-11-11) 回复 编辑
    • cannot find -lgcc_s,即没有发现-libgcc_s.so。 解决办法:查找/root/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc/lib目录,如果有libgcc_s.so.1,做一个链接:ln -s libgcc_s.so.1 libgcc_s.so,重新make,此问题可以解决。 如果再出现以下问题: 同理,其他的问题,也在/arm-none-linux-gnueabi/libc/lib目录下, 问题:cannot find /lib/libc.so.6 inside,解决:ln -s libc-2.5.so libc.so.6 问题:cannot find /lib/ld-linux.so.3 inside,解决:ln -s ld-2.5.so ld-linux.so.3
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  4. 用nfs从主机复制到目标板时出现: cp: omitting directory '/etc/boa' 等错误。
    六天 3年前 (2014-11-11) 回复 编辑
    • 权限不够,或者目标板中等/usr/local/etc已经有文件。解决办法:在cp命令后加-r参数,如:cp -r /etc/* /usr/local/etc/
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  5. 错误:Privilege separation user sshd does not exist
    跳河才洗的请 3年前 (2014-11-11) 回复 编辑
    • 需要在开发板的系统里adduser shhd //或者在/etc/passwd 中添加下面这一行 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  6. Permissions 0755 for '/usr/local/etc/ssh_host_dsa_key' are too open.
    OpenSSH 3年前 (2014-11-11) 回复 编辑
    • 把目标板/usr/local/etc/下的ssh_host_*几个文件的权限改为700。如果出现权限不够问题,用su - root进入root用户再改。 命令:# chmod 700 ssh_host_*
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  7. Permission denied (publickey,password,keyboard-interactive).
    Linux天才 3年前 (2014-11-11) 回复 编辑
    • 打开开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉。
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  8. configure配置openssh的时候出错:configure: error: *** zlib missing - please install first or check config.log ***
    visani 3年前 (2014-11-11) 回复 编辑
    • 没有找到zlib。问题解决:重新交叉编译zlib,再configure即可。openssl也是同样的道理。
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  9. 以下两个函数没找到: /home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1410: undefined reference to `pkcs11_init' /home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1493: undefined reference to `pkcs11_terminate'
    visani 3年前 (2014-11-11) 回复 编辑
    • 打开ssh-keygen.c:vi ssh-keygen.c 屏蔽这1410和1493这两行函数。
      ARM Linux 3年前 (2014-11-11) 回复 编辑
  10. 开启sshd后,没有找到sftp-server服务,不能传输文件, Failed to connect SFTP subsystem: Remote host may not have sftp-server installed : java.io.IOException: inputstream is closed
    猪想瘦 3年前 (2014-11-11) 回复 编辑
    • 显然,这是没有找到sftp子服务。 问题解决:打开目标版/usr/local/etc/sshd_config,找到这么一行: Subsystem sftp /usr/libexec/sftp-server 看出问题了吧?配置文件中指明的sftp子服务并不是我们放的目录,所以修改为: Subsystem sftp /usr/local/libexec/sftp-server 然后kill掉sshd,再启动就可以用sftp-server了。
      OpenSSH 3年前 (2014-11-11) 回复 编辑
  11. 运行sshd时出现: Could not load host key: /usr/local/etc/ssh_host_dsa_key Could not load host key: /usr/local/etc/ssh_host_ecdsa_key Could not load host key: /usr/local/etc/ssh_host_ed25519_key
    123 3年前 (2014-11-11) 回复 编辑
    • 看文章第八步《生成key文件》可解决
      visani 3年前 (2014-11-11) 回复 编辑
  12. xiexie!!
    康秋华 2年前 (2015-12-30) 回复 编辑
  13. 不错啊! 一个字牛啊!
    康秋华 2年前 (2015-12-30) 回复 编辑
  14. 顶也~~~
    徐晓晓 2年前 (2016-01-28) 回复 编辑
  15. 请问下 ftp上传到板子上 运行sshd 的时候 显示段错误 是什么原因呀?
    _ 1年前 (2016-04-28) 回复 编辑
    • 老哥问也是Segmentation fault,请问有没有解决啊
      111 1周前 (09-12) 回复 编辑