向嵌入式linux开发板移植openSSH

向嵌入式linux开发板移植openSSH

晚上没事干,想着能不能把高大上的openSSH移植到我现在开发的嵌入式linux开发板上,前不久刚弄出来dropbear,但遇到一些小问题,一会说,所以把openSSH搞上去还是可以的。开发板端为服务器端,由宿主机客户端访问。

2016-8-16

背景

  • 开发板:freescale i.mx6q
  • 宿主机操作系统:ubuntu 14.04
  • 开发板操作系统:linux 3.0.35

基本情况

使用dropbear后,ssh算是在板子上成功跑起来了,参见我另一篇日记,然而,在使用的过程中,需要对root用户重新设置一次密码后,才可以正常操作,然而,由于我对板子本身编译进去的ftp不了解,重新设置root密码后,就无法使用ftp传输文件了。了解到dropbear自带了scp协议一个简单文件传输工具,于是就开始搞,后来没搞出来。然后去研究如何把sftp加入到dropbear中,过程需要编译openSSH并提取sftp。得了,就直接搞openSSH吧。

经后来测试,编译后的openSSH可执行文件约为16M,确实足够大了,还好板子上的内存容量还足够。开启一个shell后的运行内存基本忽略,还是可以用的,最关键openSSH里还带有sftp,scp等工具,简直方便。

步骤

编译

1.需要用到的源码包有:openssh,openssl,zlib,请按下列地址下载:

openssh-7.3: http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/openssh-7.3.tar.gz

openssl-1.0.1t: https://www.openssl.org/source/openssl-1.0.1t.tar.gz

zlib-1.2.8: http://zlib.net/zlib-1.2.8.tar.gz

请登录网站选择合适的版本下载。

2.首先编译zlib,这里不再重复写,参考我之前的日记(向嵌入式linux开发板移植dropbear)

3.编译openssl:openssl根目录下:

~ # mkdir /usr/local/openssl
~ # ./Configure --prefix=/usr/local/openssl os/compiler:arm-fsl-linux-gnueabi-gcc
~ # make
~ # make install

4.编译openssh:openssh源码根目录下:

~ # mkdir /usr/local/openssh
~ # ./configure --host=arm-linux --prefix=/usr/local/openssh --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/openssl --disable-etc-default-login --disable-strip CC=arm-fsl-linux-gnueabi-gcc AR=arm-fsl-linux-gnueabi-ar

这里创建/usr/local/openssh并没有作用,openssh是要运行在开发机的,在宿主机中make install没有意义,这里是习惯性做法。另外,网上的技术帖子说将本地的路径作为打包路径一并打包,也是一种做法,但我认为略显麻烦或混乱,我最终是用脚本按部署所有的openssh工具的。

第二句命令配置configure,其中--disable-etc-default-logindisable using PATH from /etc/default/login no; --disable-stripdisable calling strip(1) on install,不大清楚有啥用,先记着了。第一次编译时没有添加这个参数,但最终还是设置成功了。

然后接着,在openssh源码路径下:

~ # make

这里不需要make install,上边说过。据我印象,这次make会产生一些问题,都是与设置交叉编译链有关系的,如果遇到问题,就在Makefile文件中做对应的修改。

开发机

在开发机中新建以下目录:

/usr/local/openssh/bin
/usr/local/openssh/etc
/usr/local/libexec
/var/run
/var/empty

openSSH编译之后,会生成好多可执行文件,我们将以下文件上传到开发机的固定位置。

以下文件拷贝到开发机/usr/local/openssh/bin目录下:

scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan

以下文件拷贝到开发机/usr/local/openssh/etc目录下:

moduli ssh_config sshd_config

以下文件拷贝到开发机/usr/local/libexec目录下:

sftp-server ssh-keysign

注意: 这里可能应该把sftp-server拷贝到/usr/libexec路径下,与sshd_config配置文件的设置默认路径相匹配,我没有实际试过,但应该是这样的,下边会有详细叙述。

以下文件拷贝到开发机/etc/rc.d/init.d目录下:

sshd

8-19 补充:这里可能有些不合理的操作,在/etc/rc.d/init.d路径下,默认是一些脚本文件,包装调用对应同名二进制程序的脚本,增加一些文件判断,启停命令,而不是直接调用二进制程序,我们这里把二进制文件放在这里,是可以实现功能的,但做法不完全合理。一种做法是,将sshd文件拷贝到/sbin/sshd目录下,而在/etc/rc.d/init.d目录下添加一个脚本文件,同名,脚本内容见文末。(我是按照补充部分的做法实现的)

另注:将二进制程序放到/etc/rc.d/init.d中,而在/sbin目录中增加软链接的方式,不是错误的,也有这么做的,比如busybox程序在/sbin目录下建立了所有相关程序的软连接到/bin/busybox,是可以实现的,个人投其所好吧。

建立软链接:

~ # cd /bin
~/bin # ln -s /usr/local/openssh/bin/scp
~/bin # ln -s /usr/local/openssh/bin/sftp
~/bin # ln -s /usr/local/openssh/bin/ssh
~/bin # ln -s /usr/local/openssh/bin/ssh-add
~/bin # ln -s /usr/local/openssh/bin/ssh-agent
~/bin # ln -s /usr/local/openssh/bin/ssh-keygen
~/bin # ln -s /usr/local/openssh/bin/ssh-keyscan
~ # cd /sbin
~/sbin # ln -s /etc/rc.d/init.d/sshd

这里的最后一句:~/sbin # ln -s /etc/rc.d/init.d/sshd是对的,但有另一种方案,如上边8-19 补充所述。

开发板配置

在开发板上创建sshd的工作目录和用户:(第一次编译时,并没有做这一步操作,有待之后验证)

~ # addgroup sshd
~ # adduser -G sshd -g ‘sshd privsep‘ -h /var/empty -s /bin/ssh sshd

8-17补充:并没有作用,sshd用户默认系统给定了,只不过是禁止登陆状态,需要修改/etc/passwd文件,或给sshd重新设定密码。这一步可以暂时不做,往下看。

在目标机上产生证书密码对:

~ # cd /usr/local/openssh/etc/
~/usr/local/openssh/etc # ssh-keygen -t rsa1 -f ssh_host_key -N ""
~/usr/local/openssh/etc # ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
~/usr/local/openssh/etc # ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
~/usr/local/openssh/etc # ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ""
~/usr/local/openssh/etc # ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N ""

配置完这部分后,etc目录下产生很多密码对,另外,这里遇到一个问题,我配置ssh-keygen -t rsa1 -f ssh_host_key -N ""时,始终不成功,未解决。

8-19猜测 :经猜测,我认为是我使用的openSSH版本过高,不再支持ssh1的key,也是软件为了安全考虑吧。

现在执行:

/sbin/sshd

就可以正常工作了,可以远程登录ssh,以及使用sftp等工具。注意,这里不能用相对路径,如../init.d/sshd,查资料知,ssh担心用户恶意修改出同名文件的程序替换真实的sshd而造成安全问题,要求用户调用ssh必须完整地址。这个配置应该可以从某个地方取消,我还没研究。

另外可以增加启动项,使openssh开机启动。开机启动我是这么做的:

编辑/etc/rc.d/rc.conf文件,在其中cfg_services项中增加:

sshd network

同时在cfg_services_r项中增加对应的相反内容。因为ssh要自动联网,所以我把network也一并记在这里。

然后在文件下边增加:

export SYSCFG_IFACE0=y
export INTERFACE0="eth0"
export IPADDR0="192.168.1.33"
export NETMASK0="255.255.255.0"
export BROADCAST0="192.168.1.255"
export GATEWAY0="192.168.1.1"
#export NAMESERVER0="202.102.224.68"    #dns

修改对应的参数为你的参数,这样就可以上网了,在/etc/rc.d/init.d/network中会自动连接网络。

用户登录配置

需要修改root用户登录权限,这是我遇到的第二个问题,这个问题解决了。

修改sshd_config文件:

~ # cd /usr/local/openssh/etc
~/usr/local/openssh/etc # vi sshd_config
PermitRootLogin yes

然后修改root账户的密码,或者自己创建其他账户并设密码,没有密码的账户默认是不能SSH登录的。即使烧录系统后root是有默认密码的,也需要重新设置密码:

~ # passwd root

另外,由于用Dropbox构建的根文件系统不满足ssh安全标准,所以这时可能还无法登录,会始终提示WARNING: Your password has expired. You must change your password and login again!,解决办法是,手动修改/etc/shadow文件,如下:

root:......:11851:5:99999:7:5:20000:
sshd:......:11851:5:99999:7:5:20000:

中间省略号的地方是密码,每个机器都不相同,如果我上边的11851这块在你的板子上是0,就不能通过SSH安全标准,可以试着改成和下边其他账户一样的数字。网上还说将运行有openssh的宿主机的/etc/passwd /etc/shadow group文件复制到开发板/etc目录下,同时将passwd中的root行最末尾/bin/bash改为/bin/sh,也可以解决这个问题。我未尝试,有待验证。

后来遇到一个问题,ssh登录正常,但sftp无法登录,查阅网络资料,后来找到了问题的解决方案。

查看配置文件sshd_config

~ # cd /usr/local/openssh/etc
~/usr/local/openssh/etc # vi sshd_config

找到一条:

Subsystem       sftp    /usr/libexec/sftp-server

查看路径,发现与我自己的sftp-server路径不同,我的路径是/usr/local/libexec/sftp-server,可能他这个是正确的吧,修改自己的sftp-server到配置文件中的路径或者修改配置文件中的路径到自己这个文件的路径,都可以解决这个问题。

登录方式

在客户端输入:ssh [email protected]登录,root为用户名,后接ssh服务器ip地址。

问题

  1. 配置密钥对ssh-keygen -t rsa1 -f ssh_host_key -N ""时始终不成功,提示:Saving key "ssh_host_key" failed: unknown or unsupported key type,但配置其他几个key都成功了。未解决。
  2. 当登录SSH时,提示WARNING: Your password has expired. You must change your pasword and login again!。已解决,解决方案如上。
  3. 可以登录ssh,但无法登录sftp,提示connect close。问题已解决,解决方案如上。

参考文章

  1. i.MX6 Openssh移植与测试 http://jingyan.eeboard.com/article/71120
  2. 将OpenSSH Server 移植到ARM Linux成功http://blog.csdn.net/david_xtd/article/details/11734225
  3. 移植openssh至arm9嵌入式开发板及常见错误 http://blog.csdn.net/evenness/article/details/16881975
  4. OpenSSH移植到ARM Platform–特指启动SSHD服务 http://www.2cto.com/os/201302/188376.html

    ?

附件

#!/bin/sh

# This is the start/stop/restart script for the openSSH server daemon "sshd"
#
# before this script run, you should modify that sshd binary software is already
# placed in /sbin/sshd directory.
#
# Please put this script in /etc/rc.d/init.d/sshd and give it executable permission.
#
# 2016-8-19
# created by PWE LiumingYang, email is [email protected]
#

Exitcode=0
Sshd="/sbin/sshd"

Keygen="/usr/local/openssh/bin/ssh-keygen"
Rsa1key="/usr/local/openssh/etc/ssh_host_key"
Rsakey="/usr/local/openssh/etc/ssh_host_rsa_key"
Dsakey="/usr/local/openssh/etc/ssh_host_dsa_key"
Ecdsakey="/usr/local/openssh/etc/ssh_host_ecdsa_key"
Ed25519key="/usr/local/openssh/etc/ssh_host_ed25519_key"

func_rsa1_keygen()
{
    if [ ! -s $Rsa1key ]
    then
        echo "generating ssh1 rsa host key..."
        if $Keygen -q -t rsa1 -f $Rsa1key -N "" > /dev/null 2>&1
        then
            /bin/chmod 600 $Rsa1key
            /bin/chmod 644 $Rsa1key.pub
            echo "ssh1 rsa host key done"
        else
            echo "failed to generate ssh1 rsa host key"
        fi
    fi
}

func_rsa_keygen()
{
    if [ ! -s $Rsakey ]
    then
        echo "generating ssh2 rsa host key..."
        if $Keygen -q -t rsa -f $Rsakey -N "" > /dev/null 2>&1
        then
            /bin/chmod 600 $Rsakey
            /bin/chmod 644 $Rsakey.pub
            echo "ssh2 rsa host key done"
        else
            echo "failed to generate ssh2 rsa host key"
        fi
    fi
}

func_dsa_keygen()
{
    if [ ! -s $Dsakey ]
    then
        echo "generating ssh2 dsa host key..."
        if $Keygen -q -t dsa -f $Dsakey -N "" > /dev/null 2>&1
        then
            /bin/chmod 600 $Dsakey
            /bin/chmod 644 $Dsakey.pub
            echo "ssh2 dsa host key done"
        else
            echo "failed to generate ssh2 dsa host key"
        fi
    fi
}

func_ecdsa_keygen()
{
    if [ ! -s $Ecdsakey ]
    then
        echo "generating ssh2 ecdsa host key..."
        if $Keygen -q -t ecdsa -f $Ecdsakey -N "" > /dev/null 2>&1
        then
            /bin/chmod 600 $Ecdsakey
            /bin/chmod 644 $Ecdsakey.pub
            echo "ssh2 ecdsa host key done"
        else
            echo "failed to generate ssh2 ecdsa host key"
        fi
    fi
}

func_ed25519_keygen()
{
    if [ ! -s $Ed25519key ]
    then
        echo "generating ssh2 ed25519 host key..."
        if $Keygen -q -t ed25519 -f $Ed25519key -N "" > /dev/null 2>&1
        then
            /bin/chmod 600 $Ed25519key
            /bin/chmod 644 $Ed25519key.pub
            echo "ssh2 ed25519 host key done"
        else
            echo "failed to generate ssh2 ed25519 host key"
        fi
    fi
}

case "$1" in
    start)
        echo "sshd create keys:"
        #ssh1 rsa is not supported in openSSH new version
        #func_rsa1_keygen
        func_rsa_keygen
        func_dsa_keygen
        func_ecdsa_keygen
        func_ed25519_keygen
        echo "starting sshd:"
        $Sshd
        Exitcode=$?
        ;;
    stop)
        echo "stopping sshd:"
        /bin/killall $Sshd
        Exitcode=$?
        ;;
    restart)
        echo "restarting sshd:"
        /bin/killall $Sshd
        $Sshd
        Exitcode=$?
        ;;
    *)
        echo "Usage: sshd {start|stop|restart}"
        Exitcode=1
esac

exit $Exitcode

#End sshd
时间: 08-25

向嵌入式linux开发板移植openSSH的相关文章

嵌入式linux开发uboot移植(七)——三星官方uboot的移植

嵌入式linux开发uboot移植(七)--三星官方uboot的移植 友善之臂Smart210开发板是基于三星SMDKV210评估板裁剪.调整而来的.因此三星官方发布的基于SMDKV210评估板的uboot是移植uboot到Smart210开发板的最合适uboot版本.本文将SMDKV210的uboot移植到Smart210开发板.Smart210开发板的配置如下: SoC:Samsung S5PV210 SDRAM:512MB DDR2 RAM FLASH存储:2G MLC NAND Flas

嵌入式linux开发环境搭建(三)——TFTP服务器的搭建

嵌入式linux开发环境搭建(三)--TFTP服务器的搭建 系统环境:Ubuntu 14.04 server amd64 1.软件安装 apt-get install tftpd tftp openbsd-inetd 2.查看修改配置文件vim /etc/inetd.conf tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp /srv/tftp为Tftp服务器根目录,可以修改为/home/tftp 3.创

嵌入式 Linux根文件系统移植(一)——Linux文件系统简介

嵌入式 Linux根文件系统移植(一)--Linux文件系统简介 本文对文件系统分析的代码来源于linux 2.6.35.7版本. 一.文件系统的体系结构 文件系统是对存储设备上的数据和元数据进行组织的机制,便于用户和操作系统的交互.Linux支持多种文件系统,文件系统接口实现为分层的体系结构,将用户接口层.文件系统实现和操作存储设备的驱动程序分隔开.Linux文件系统的体系结构如下: 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C库(glibc),为文件系统调用(打开.读取.

嵌入式linux开发环境搭建(四)——Samba服务器的搭建

嵌入式linux开发环境搭建(四)--Samba服务器的搭建 linux系统:ubuntu Server 12.04 安装流程如下: 1.安装 sudo apt-get install samba samba-common 2.修改配置文件/etc/samba/smb.conf [samba] comment = Samba Server browseable = yes path = /home/samba printable = no writable = yes write list =

嵌入式linux开发环境搭建(五)——Ubuntu第三方软件仓库源

嵌入式linux开发环境搭建(五)--Ubuntu第三方软件仓库源 一般来说ubuntu官方的软件仓库由于服务器在国外,下载更新速度较慢,需要将软件仓库更换为国内镜像点. 1.修改源配置文件 先备份原来的配置文件 mv /etc/apt/sources.list /etc/apt/sources.list.bak vim /etc/apt/sources.list 将国内的Ubuntu镜像点添加到配置文件 Ubuntu 163镜像点: deb http://mirrors.163.com/ubu

(笔记) (ARM) QQ2440 开发板改为 GT2440 (Linux) (开发板)

QQ2440改 GT24401跟换Nand Flash   将QQ2440的Nand Flash k9f1208u0b (64M)焊接取下来,换上k9f2g08u0a 或k9f2g08u0b (256M)2.去掉QQ2440板上右边靠中间的电阻 NR5,不去掉无法从Nand Flash 启动 这里去掉电阻配置 Nand Flash Memory Configuration Table 对应的管脚 NCON0,      GPG13,    GPG14,    GPG15            

成功移植SQLite3到ARM Linux开发板

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快. 在开始之前,我们需要确认有 SQLit

嵌入式开发-迅为iMX6开发板移植移动4G模块第一部分

迅为Qt移植移动4G模块第一部分 详情了解:http://topeetboard.com  更多了解:https://arm-board.taobao.com 1.首先要配置内核,这个一步和Android系统移植3G或者4G模块是一样的.一般模块的厂家会提供移植文档,按照文档配置内核的ppp协议,USB转串,wcdma等,添加PID VID即可.这一步严格按照模块内核修改就行.这里主要分析qt文件系统的修改,对内核不做过多的分析.配置好的内核在开机后可以在dev下找到ttyUSB0-3的设备节点

【嵌入式4412开发板学习教程】Uboot教程之uboot基础概念和框架

[4412开发板教程]Uboot教程之uboot基础概念和框架 正在学习uboot,教程讲解的很详细,先上个笔记,视频上传到网盘后再补上...... 知识点: 1.操作系统分层的概念 Windows:bios→内核模式→用户模式→用户程序 linux:bootloader→内核→文件系统→用户程序 2.bootboader种类介绍 U-boot是最通用的bootboader.(210,4412等等) vivi 针对三星的ARM来定制2440上有用到 3.4412休眠问题 它可以直接跳过uboot