交叉编译openssh(JZ2440+linux kernel2.6.22.6)

常用远程登录嵌入式linux系统板开发方式介绍

相信很多跑嵌入式linux的小伙伴都会经历搞块板子然后移植一个低版本的linux kernel然后进行各种交叉编译开发的经历。然而使用串口去做终端交互实在是效率太低,于是使用telnet和ssh都是比较好的选择。telnet只要是移植了busybox基本上都会有的。ssh则需要自己去交叉编译移植一下。
telnet简单粗暴又好用,自己开发用其实就够了,但是如果想要玩的开心深入一点,怎么能不去交叉编译ssh折腾一番呢?下面就介绍下这两种方法。

Telnet

基本上能来看这帖子的都已经实现了busybox的移植,会有telnet工具。那么只要在板子上把服务开一下就好。

telnetd -l /bin/sh  

如果没添加过用户密码的需要添加一下密码,直接用root用户就好了,自己的板子也不用考虑使用其他用户溯源这些事情了。

# passwd root

有的小伙伴会遇到如下错误:
passwd: unknown uid 0
网上有人说是因为lib下没有那几个动态库的,但是我看了我的板子上面是有的,最后发现应该是板子/etc/passwd里的信息不对
可以通过下面的方式更改如下:

# echo root:x:0:0:root:/root:/bin/sh > /etc/passwd
# chmod 755 /etc/passwd
# passwd  root

下面一直完openssl也会有设置密码的时候,如果有上面的问题也可以这么解决。

交叉编译openssh

我的工具链是
arm-linux-gcc-3.4.5-glibc-2.3.6
解压到自己的目录下,然后
vim setenv.sh 把路径设置下,如下:

文件内容:export PATH=$PATH:/work/ssh/tools/gcc-3.4.5/gcc-3.4.5-glibc-2.3.6/bin
然后
chmod 777 setenv.sh
source setenv.sh 

下面流程主要是参考下面链接里的这位两位的方法,从下载、配置、编译、拷贝、软连接、运行等各个步骤详细介绍,还是比较便捷的。
http://blog.sina.com.cn/s/blog_86d540e401019yie.html
http://bbs.100ask.org/forum.php?mod=viewthread&tid=17941&highlight=ssh
具体方法如下:
1》下载需要的源码
从官网下或者国外镜像下很慢,可以网上搜搜,或者从github上下吧:
github-tools.
下载zlib:zlib-1.2.3.tar.gz http://www.zlib.net
下载ssl: openssl-0.9.8e.tar.gz http://www.openssl.org/source/
下载ssh: openssh-4.6p1.tar.gz http://mirror.aarnet.edu.au/pub/OpenBSD/OpenSSH/portable/
2》编译
/home/arm下新建目录sshwork,并且将源码复制到该目录下
mkdir /home/arm/sshwork
cp zlib-1.2.3.tar.gz openssl-0.9.8e.tar.gzopenssh-4.6p1.tar.gz /home/arm/sshwork
/home/arm/sshwork下新建目录lib,用来保存生成的库文件。
mkdir /home/arm/sshwork/lib
1、编译zlib
tar zxvf zlib-1.2.3.tar.gz -C .
cd zlib-1.2.3/
./configure -prefix=/home/arm/sshwork/lib/zlib-1.2.3
修改Makefile:
CC=gcc 改为:
CC=arm-linux-gcc
LDSHARED= gcc 改为:LDSHARED=arm-linux-gcc
CPP= gcc - E 改为:CPP=arm-linux-gcc - E
AR= ar rc 改为:AR=arm-linux-ar rc
开始编译: make
make install
2、编译openssl
tar zxvf openssl-0.9.8e.tar.gz
./Configure --prefix=/home/arm/sshwork/lib/openssl-0.9.8dos/compiler:arm-linux-gcc
make
make install
3、编译openssh
tar zxvf openssh-4.6p1.tar.gz
cd openssh-4.6p1/
./configure -host=arm-linux -with-libs-with-zlib=/home/arm/sshwork/lib/zlib-1.2.3
-with-ssl-dir=/home/arm/sshwork/lib/openssl-0.9.8e-disable-etc-default-login
CC=arm-linux-gcc AR=arm-linux-ar
make
##不要make install

3》安装
确保目标板上有以下目录,如果没有,则新建(目录层次很重要,不要改变)
/usr/sbin
/usr/local/bin
/usr/local/libexec
/usr/local/etc/
1、在 openssh-4.6p1 目录下创建 usr bin 目录,文件临时拷贝到这里,然后统一打包到开发板
cd openssh-4.6p1
mkdir -p bin
mkdir -p usr/sbin
mkdir -p usr/local/bin
mkdir -p usr/local/libexec
mkdir -p usr/local/etc
#sshd 工作目录
mkdir -p var/run
mkdir -p var/empty/sshd
chmod sshd var/empty
2、将 openssh-4.6p1目录下的 sshd 拷贝到 目标板的 /usr/sbin 目录下
cp sshd ./usr/sbin
3、将 copy scp sftp sshssh-add ssh-agent ssh-keygen ssh-keyscan 到目标板/usr/local/bin目录下
cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan ./usr/local/bin
4、将 sshd_config ssh_config拷贝到 /usr/local/etc/ 目录下
cp sshd_config ssh_config ./usr/local/etc
5、将 sftp-server ssh-keysign 到 /usr/local/libexec
cp sftp-server ssh-keysign ./usr/local/libexec
6、在主机上生成密钥
ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N “”
ssh-keygen -t rsa -f ssh_host_rsa_key -N “”
ssh-keygen -t dsa -f ssh_host_dsa_key -N “”
将生成的 ssh_host_key这3个文件copy到./usr/local/etc/目录下
cp ssh_host
./usr/local/etc/
7、在开发板 bin 目录下创建软连接
ln -s /usr/local/bin/scp
ln -s /usr/local/bin/sftp
ln -s /usr/local/bin/ssh
ln -s /usr/local/bin/ssh-add
ln -s /usr/local/bin/ssh-agent
ln -s /usr/local/bin/ssh-keygen
ln -s /usr/local/bin/ssh-keyscan
8、打包
mkdir …/final
cp -r bin sbin usr …/final
cd …/final
tar czvf openssh.tgz ./
将openssh.tgz 拷贝到开发板根目录解压
9、启动开发板,添加用户
touch /etc/passwd
touch /etc/group
mkdir -p /home/sshd
adduser sshd
adduser root
passwd root 为root用户设置密码

将开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉

结束语

这种工具移植的过程还是很有意思的,每个人的环境不太一样,遇到的问题也可能不太相同。通过在网上搜索估计能把多数人遇到的情况解决,如果想一探究竟的话,可以把源码拿来分析一下,其实也不是很难。后面更新一篇类似方法的文章来抛砖引玉。

你可能感兴趣的:(嵌入式linux)