分类: LINUX
2013-02-05 10:01:07
OpenSSH移植到ARM Platform
声明
本人在本博客的所有内容(包括但不限于文字、图表、商标、标识、按钮图标、图像、声音片段、数据及软件等)均基于知识共享目的,除知识的相授,不接收任何利益;如若发现本博客有任何不慎涉及您版权利益的内容,请及时告知,本人将第一时间予以处置。
名称 |
版本 |
包 |
OpenSSH |
6.0p1 |
openssh-6.0p1.tar.gz |
OpenSSL |
1.0.1c |
openssl-1.0.1c.tar.gz |
ZLIB |
1.2.3 |
zlib-1.2.3.tar.gz |
注意:笔者使用的交叉编译工具链为arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2010.09-50) 4.5.1。
在主机中新建一个openssh目录,存放下载的源文件压缩包,并在该文件夹下解压。
# mkdir –p openssh |
# tar -xz –f openssh-6.0p1.tar.gz --解压OpenSSH源码包 |
# tar -xz -f zlib-1.2.3.tar.gz --解压ZLIB源码包 |
# tar –xz -f openssl-1.0.1c.tar.gz --解码OpenSSL源码包 |
在openssh目录下创建install目录,用于存放生成文件和安装目录。
# mkdir –p install |
(1)编译zlib
# cd (全路径名)/openssh/zlib-1.2.3 |
# ./configure --prefix=(全路径名)/openssh/install/zlib-1.2.3 |
修改zlib-1.2.3目录下Makefile: ? 在第一行添加如内容: CROSS=arm-none-linux-gnueabi- ? CC=gcc 改为: CC=$(CROSS)gcc ? LDSHARED=gcc 改为: LDSHARED=$(CROSS)gcc ? CPP=gcc -E改为: CPP=$(CROSS)gcc -E ? AR=ar rc 改为: AR=$(CROSS)ar rc |
# make |
# make install |
经过编译和安装之后,编译产生的ZLIB库和头文件就安装在了“(全路径名)/openssh/install/zlib-1.2.3”目录下。
# cd (全路径名)/openssh/openssl-1.0.1c |
# ./Configure –prefix=(全路径名)/openssh/install/openssl-1.0.1c os/compiler:arm-none-linux-gnueabi-gcc |
# make |
# make install |
经过编译和安装之后,编译产生的OpenSSL库和头文件就安装在了“(全路径名)/openssh/install/openssl-1.0.1c”目录下。
# cd (全路径名)/openssh/openssh-6.0p1 |
# ./configure --host=arm-linux --with-libs --without-pam --with-zlib=/home/Archer/Desktop/openssh/install/zlib-1.2.3 --with-ssl-dir=/home/Archer/Desktop/openssh/install/openssl-1.0.1c --disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar |
# make |
# make install |
至此,OpenSSH的编译完成。
u 将 openssh-6.0p1目录下的 sshd复制到目标板的/usr/local/sbin目录;
u 将 openssh-6.0p1目录下的scp、sftp、ssh、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan 和ssh-rand-helper复制到目标板的/usr/local/bin目录;
u 将openssh-6.0p1目录下的sftp-server和ssh-keysign复制到目标板的/usr/local/libexec目录;
u 将openssh-6.0p1目录下的sshd_config、ssh_config 和moduli拷贝到目标板的/usr/local/etc目录;
u 在目标板上创建SSHD工作所需目录和用户;
# mkdir /var/empty # chown root:root /var/empty # chmod 755 /var/empty # addgroup sshd # adduser -G sshd -g 'sshd privsep' -h /var/empty -s /bin/ssh sshd |
u 在目标机或者主机上,产生证书/密码对等。
# ssh-keygen -t rsa1 -f ssh_host_key -N "" # ssh-keygen -t rsa -f ssh_host_rsa_key -N "" # ssh-keygen -t dsa -f ssh_host_dsa_key -N "" |
产生的6个文件ssh_host_dsa_key、ssh_host_dsa_key.pub、ssh_host_key、ssh_host_key.pub和ssh_host_rsa_key、ssh_host_rsa_key.pub需要复制到目标板得/usr/local/etc目录。
u 运行/usr/local/sbin/sshd即可开启SSH服务。
笔者使用的Busybox版本为1.17.3。
u 编译Busybox时,“Login/Password Management Utilities---> [ ]Use internal password and group functions rather than system functions”此项不要选。
u /etc/passwd,该文件要特别关注,因为OpenSSH(SSHD)对用户管理校验要求很严,所以Busybox添加的用户基本是不符合要求的,主要表现为密码失效等,要手动修改,示例如下:
使用Busybox添加用户时,/etc/shadow文件大概形式如下: # cat /etc/shadow root:$1$m.jegaqA$vA.rBTVryyUAcRvyZ2gOL1:0:0:99999:7::: telnetd:$1$N4uZUEcU$yotoDExxgGXs6PE7PQuIR1:0:0:99999:7::: honey:$1$SwtHyL/h$MsEX6Vnqz/qhwDsivDqD20:0:0:99999:7::: sshd:$1$elylgRon$FOHgkwpPMcNI5s.iL8ZS/.:0:0:99999:7::: 这样的话,使用SSH登录就会出现用户登录失败,提示诸如“WARNING: Your password has expired. You must change your password now and login again!”等等。 需要手工修改,大致如下: # cat /etc/shadow root:$1$m.jegaqA$vA.rBTVryyUAcRvyZ2gOL1:15695:5:99999:7:5:20000: telnetd:$1$N4uZUEcU$yotoDExxgGXs6PE7PQuIR1:15695:5:99999:7:5:20000: honey:$1$SwtHyL/h$MsEX6Vnqz/qhwDsivDqD20:15695:5:99999:7:5:20000: sshd:$1$elylgRon$FOHgkwpPMcNI5s.iL8ZS/.:15695:5:99999:7:5:20000: |