【转载】移植openssh至arm9嵌入式开发板及常见错误

需要打包好的文件请留邮箱



参考文章(一)

原文链接:http://blog.csdn.net/evenness/article/details/16881975



首先说移植的目的:有了ssh开机自动启动,就不用串口线来操作开发板了,可以节省很多时间,特别是文件传输的缓慢实在无法忍受。

移植过程:

下载相关源码:

openssh:http://mirror.esc7.net/pub/OpenBSD/OpenSSH/portable/openssh-6.1p1.tar.gz

openssl:http://www.openssl.org/source/openssl-1.0.1c.tar.gz

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

然后配置好交叉编译工具

 
 
  1. mkdir source package 
  2. mkdir package/zlib 
  3. mkdir package/openssl 
  4. mv openssh-6.p1.tar.gz openssl-1.0.1c.tar.gz zlib-1.2.7.tar.gz ./source 
  5. cd source 
  6. tar xzvf openssh-6.p1.tar.gz 
  7. tar xzvf openssl-1.0.1c.tar.gz 
  8. tar xzvf zlib-1.2.7.tar.gz 

1.编译zlib

 
 
  1. ./configure --prefix=/home/nenew/package/zlib 

修改Makefile

 
 
  1. CC=arm-linux-gcc 
  2. AR=arm-linux-ar 
  3. CPP =arm-linux-gcc -E 
  4. LDSHARED=arm-linux-gcc 

就是讲gcc ar用arm-linux-gcc arm-linux-ar来代替

 
 
  1. make 
  2. make install 

2.编译openssl

 
 
  1. ./Configure --prefix=/home/nenew/package/openssl os/compiler:arm-linux-gcc 

这里可以直接指定交叉编译器,如果想知道哪些编译文件可以直接支持的话,一般./configure –help就可以看到说明

 
 
  1. make 
  2. make install 

3.编译openssh

 
 
  1. ./configure --host=arm-linux --prefix=/usr/local/openssh --with-zlib=/home/nenew/package/zlib --with-ssl-dir=/home/nenew/package/openssl --disable-etc-default-login --disable-strip CC=arm-linux-gcc AR=arm-linux-ar 

指定好了prefix为安装的目标目录,zlib与ssl的路径也就是我们刚才的安装路径,最后指定交叉编译器

 
 
  1. make 

这里并不安装,理由是不需要安装,安装到本机也无法执行,因为我们是交叉编译,你也许会问,为什么不直接换个预置安装目录来安装呢?如果不动手做你是不会知道的,sshd启动的时候会去安装目录下的etc找配置文件滴,所以这个目录不要随便指定,网上那些教程很多这里的路径都是有问题的。

编译工作至此结束,可以开始移植openssh了。

 
 
  1. mkdir -p usr/local/openssh 
  2. cd usr/local/openssh 
  3. mkdir etc bin 
  4. cd ../../../ 
  5. cp scp  sftp  ssh  ssh-add  ssh-agent  ssh-keygen  ssh-keyscan ./usr/local/openssh/bin 
  6. cp sshd_config ssh_config ./usr/local/openssh/etc 
  7. mkdir sbin bin 
  8. cp sshd ./sbin 
  9. cd bin 
  10. ln -s /usr/local/openssh/bin/scp 
  11. ln -s /usr/local/openssh/bin/sftp 
  12. ln -s /usr/local/openssh/bin/ssh 
  13. ln -s /usr/local/openssh/bin/ssh-add 
  14. ln -s /usr/local/openssh/bin/ssh-agent 
  15. ln -s /usr/local/openssh/bin/ssh-keygen 
  16. ln -s /usr/local/openssh/bin/ssh-keyscan 
  17. cd .. 
  18. mkdir -p usr/local/libexec 
  19. cp sftp-server  ssh-keysign usr/local/libexec 
  20. mkdir ../final 
  21. cp -r bin sbin usr ../final 
  22. cd ../final 
  23. tar czvf openssh.tgz ./ 

目录结构大体如下:

openssh openssh移植

这就把需要拷贝的文件都准备好了,传到开发板的目录下,然后展开到/根。

这时候ssh并不能运行,还需要修改passwd与group文件,位置在/etc下,将sshd用户添加上。

passwd照着模样修改:

sshd::15:50:::/bin/sh

group照着模样修改:

sshd:*:50:

这里的两个50要对应,是组的编号

 
 
  1. mkdir -p /var/run/sshd

然后就是配置ssh key了。

 
 
  1. cd /usr/local/openssh/etc 
  2. ssh-keygen -t rsa1 -f ssh_host_key -N "" 
  3. ssh-keygen -t rsa -f ssh_host_rsa_key -N "" 
  4. ssh-keygen -t dsa -f ssh_host_dsa_key -N "" 
  5. ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N "" 

mkdir /var/empty

现在执行/sbin/sshd应该就可以正常启动了。

如果想自动启动需要增加启动脚本与启动项。

启动脚本位置:/etc/rc.d/init.d/

启动项配置文件:/etc/init.d/rcS

如何修改可以自己参照里面的实例。

至此就已经完成了移植工作了。ssh可以正常链接。对了,这里建议修改sshd_config哦,把允许root登录与空密码选项打开,因为可以方便,这个不是服务器,不需要太高的安全级别。

今天装cygwin,遇到一些问题,这篇文章整理的很全,遇到的问题解决方法基本都有。 
[问题1] 
# /usr/local/sbin/sshd 
/usr/local/sbin/sshd: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory 

[分析与解决] 
用strace跟踪sshd,查询缺少的目录和文件,给与相应的添补。 
strace -f  -F  /usr/local/sbin/sshd 
cp libnsl* /work/lib/ 


[问题2] 
# /usr/local/sbin/sshd 
Privilege separation user sshd does not exist 

[分析与解决] 
没有sshd用户 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 
scp  /etc/passwd root@HOST:/etc 
scp  /etc/shadow root@HOST:/etc 
scp  /etc/group  root@HOST:/etc 



[问题3] 
# /usr/local/sbin/sshd 
Missing privilege separation directory: /var/empty 

[分析与解决] 
# mkdir /var/empty 


   
[问题4] 
[root@localhost .ssh]# ssh -l root 192.168.167.132 
root@192.168.167.132's password: 
Permission denied, please try again. 

[分析与解决] 
密码输入错误,重新连接尝试. 



[问题5] 
# ./ssh-keygen 
Generating public/private rsa key pair. 
Enter file in which to save the key (/root/.ssh/id_rsa): 
Could not create directory '/root/.ssh'. 

[分析与解决] 
# ls / 
bin etc linuxrc nfs sys var dev jffs2 lost+found  proc tmpfs yaffs2 edwin lib mnt sbin usr 
# cd /root 
-sh: cd: can't cd to /root 
# mkdir root 
# cd /root 
# mkdir .ssh 




[问题6] 
# /usr/local/sbin/sshd 
Missing privilege separation directory: /var/empty 

[分析与解决] 
# ls /var 
# mkdir /var/empty 
# /usr/local/sbin/sshd 



[问题7] 
[root@localhost ~]# ssh 192.168.167.132 
ssh: connect to host 192.168.167.132 port 22: Connection refused      

[分析与解决] 
注释 /etc/hosts.deny   /etc/hosts.allow 中的限制部分. 
net sshd stop 
net sshd start 



[问题9] 
在客户端ssh到target后,用户帐户和密码验证通过,但是没有启动shell. 

[分析与解决] 
查看日志,发现有:PTY allocation request failed on channel 0 
1.rm -rf /dev/ptmx 
2.mknod /dev/ptmx c 5 2 
3.chmod 666 /dev/ptmx 
4.umount /dev/pts 
5.rm -rf /dev/pts 
6.mkdir /dev/pts 
7.mount /dev/pts 



[问题10] 
客户端连接卡住,无法连进. 

[分析与解决] 
有可能是cyg维护死进程太多,此为cyg的BUG,用有权限的账号连入系统: 
killall -9 bash 
killall -9 sshd 
net stop sshd 
net start sshd 



[问题11] 
ssh 显示已经脸上,但马上断开. 

[分析与解决] 
查看当前用户 /etc/password 里shell的设置是否正确. 
查看 /var/ 目录权限是否足够,包括所有者权限和文件权限. 
查看当前用户的家目录是否设置正常,权限是否足够. 



[问题12] 
sshd 服务无法启动 

[分析与解决] 
$ net start sshd 
发生系统错误 1069。 
由于登录失败而无法启动服务。 
-- 这是由于用户密码输入错误导致的,以后更改用户后sshd也可能发生这个问题,在 services.msc 里的登录标签里更改用户设置即可! 

$ net start sshd 
CYGWIN sshd 服务正在启动 . 
CYGWIN sshd 服务已经启动成功。 

事件 ID ( 0 )的描述(在资源( sshd )中)无法找到。 
本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。 
您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。 
下列信息是事件的一部分: sshd: PID 2784: fatal: setreuid 1003: Permission denied. 
-- 出现这种情况,需要重新安装服务. 
net stop sshd 
ssh-host-config 

参考文章(二)

原文链接:http://blog.csdn.net/acanoe/article/details/7853017



编译器arm-linux-gccarm-none-linux-gnueabi-gcc成功。

        在移植到友善2440的时候很容易,因为他4.3.2交叉编译器等库文件做等好。但是在移植到天漠devkit8000时,遇到非常多的问题。一个月之前遇到问题没有找到-lgcc_s的问题一直没有解决,以致后来非常影响开发进度。最近决心解决这个问题,在google上查到没有找到lxx其实时没有找到libxxx.so,然后与友善2440比较了下,发现果真是arm-none-linux-gnueabi/libc/lib下缺少libgcc_s.so。最后一步问题总结是我编译的时候遇到等所有问题,后一一化解,成功移植。所以,如果你在编译等时候出错,查看最后的问题总结,应该可以找到答案。

步骤:

1.下载源码包,地址如下:

openssh  http://www.openssh.com/portable.html
openssl  http://www.openssl.org/source
zlib     http://www.zlib.net/

2.交叉编译

创建工作目录:

#mkdir /work
#cd /work


在/work目下面创建ssh目录

# mkdir /work/lib              -----〉共享库目录,通过nfs挂载
# mkdir /work/ssh              -----〉工作目录
# cd  /work/ssh
# mkdir compressed install source  -----〉compressed 用于存放源码包
                                   -----〉Install    软件安装目录
                                   -----〉Source    源码包解压目录
#mv tarpakgs/openssh-4.6p1.tar.gz   /work/ssh/compressed
#mv tarpakgs/openssl-0.9.8e.tar.gz  /work/ssh/compressed
#mv tarpakgs/zlib-1.2.3.tar.gz      /work/ssh/compressed


解压安装包:

# cd /work/ssh/compressed/
# tar zxvf zlib-1.2.3.tar.gz  -C  ../source
# tar zxvf openssl-0.9.8e.tar.gz  -C  ../source
# tar zxvf openssh-4.6p1.tar.gz  –C ../source


交叉编译 zlib:
# cd  /work/ssh/source/zlib-1.2.3
# ./configure --prefix=/work/ssh/install/zlib-1.2.3
# vim Makefile
CC=arm-none-linux-gnueabi-gcc
AR=arm-none-linux-gnueabi-ar rc
CPP =arm-none-linux-gnueabi-gcc -E
LDSHARED=arm-none-linux-gnueabi-gcc

# make
# make install

交叉编译openssl
# cd  /work/ssh/source/openssl-0.9.8e
# ./Configure --prefix=/work/ssh/install/openssl-0.9.8e  os/compiler:arm-none-linux-gnueabi-gcc

# make
# make install

交叉编译openssh
# cd  /work/ssh/source/ openssh-4.6p1
#./configure --host=arm-none-linux-gnueabi --with-libs --with-zlib=/work/ssh/install/zlib-1.2.3 --with-ssl-dir=/work/ssh/install/openssl-0.9.8e --disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
#make
注意:openssh不需要make install

3.操作目标板

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

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

3.2从PC机上将以下文件拷贝到目标板Linux系统中

PC机 /work/ssh/source/openssh-4.6p1/ 目录下的

scp  sftp  ssh  ssh-add  ssh-agent  ssh-keygen  ssh-keyscan 拷贝到目标板/usr/local/bin

moduli ssh_config sshd_config拷贝到目标板 /usr/local/etc

sftp-server  ssh-keysign 拷贝到目标板 /usr/local/libexec

sshd 拷贝到目标板 /usr/local/sbin/

3.3生成Key文件
在PC机 /work/ssh/source/openssh-4.6p1/ 目录下运行:
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_host_*_key这3个文件copy到目标板的 /usr/local/etc/目录下


3.4修改目标板passwd文件。
在/etc/passwd 中添加下面这一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin


4.测试

在目标板上运行:
#/usr/local/sbin/sshd
可以用ps命令查看sshd是否在工作
如果运行的过程中有提示缺少动态连接库,可以在主机上搜索相应文件,拷贝到目标板/lib/目录下面,注意创建软连接!
OK!不出意外的话可以成功,

主机上:

#ssh root@192.168.0.34(开发板的ip)

然后输入开发板的root密码就就可以了。

//root密码就是你开发板上root的密码,如果之前root没有密码,需要重新设置,用passwd root,然后输入密码即可。

登录成功后如下图:


putty登录


linux主机登录

问题总结

1.运行sshd时出现
sshd: /lib/libc.so.6: version `GLIBC_2.7' not found (required by sshd) 

问题分析:说明你编译等时候指定等glibc和目标板所使用的不一致。
解决办法:配置openssh,即./configure时,使用对用等--host参数,如--host=arm-linux/arm-none-linux-gnueabi。

2.make openssl的时候,指定的prefix目录已经存在,无法创建。
问题分析:这是因为在prefix目录的时候,使用了相对路径,如../../install。
解决办法:openssl需要用指定绝对路径来安装,prefix参数应该如:--prefix=/work/ssh/install/openssl-1.0.0

3.使用arm-2007q3-51-arm-none-linux-gnueabi.bin的make编译ssh和gdbserver时出错:
/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


问题解析:
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

4.用nfs从主机复制到目标板时出现:
cp: omitting directory '/etc/boa'
等错误。

问题分析:权限不够,或者目标板中等/usr/local/etc已经有文件。
解决办法:在cp命令后加-r参数,如:cp -r /etc/* /usr/local/etc/

5.运行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


问题解析:在/usr/local/etc目录中没有相应等key。
解决办法:按照操作步骤,运行:
                 ssh-keygen -t dsa -f ssh_host_das_key -N ""
                 ssh-keygen -t ecdsa -f ssh_host_ecdas_key -N ""
生成ssh_host_das_key 和ssh_host_ecdas_key后复制到目标板/usr/local/etc/目录下。

6.从nfs复制key文件到usr/local/etc时出现:
cp: can't open 'ssh_host_dsa_key': Permission denied

问题分析:目标板复制权限不够。
解决办法:在主机中修改他们等权限为777,命令:chmod 777 *     。然后再复制。

7.Privilege separation user sshd does not exist
//需要在开发板的系统里adduser shhd
//或者在/etc/passwd 中添加下面这一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

8.Permissions 0755 for '/usr/local/etc/ssh_host_dsa_key' are too open.
//则把目标板/usr/local/etc/下的ssh_host_*几个文件的权限改为700。如果出现权限不够问题,用su - root进入root用户再改。
命令:#chmod 700 ssh_host_*

9.Permission denied (publickey,password,keyboard-interactive).
//打开开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉。


10.configure配置openssh的时候出错:
configure: error: *** zlib missing - please install first or check config.log ***
问题分析:没有找到zlib。
问题解决:重新交叉编译zlib,再configure即可。

11.以下两个函数没找到:
/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'

问题解决:
打开ssh-keygen.c:vi ssh-keygen.c
屏蔽这1410和1493这两行函数。

12.开启sshd后,没有找到sftp-server服务。如DS-5软件在连接时就出现以下错误,虽然还可以用终端,不过不能传输文件,还是很不爽的:
Failed to connect SFTP subsystem: Remote host may not have sftp-server installed : java.io.IOException: inputstream is closed

问题分析:明显的,这是没有找到sftp子服务。
问题解决:打开/usr/local/etc/sshd_config,找到这么一行:
Subsystem sftp /usr/libexec/sftp-server
看出问题了吧?配置文件中指明的sftp子服务并不是我们放的目录,所以修改为:
Subsystem sftp /usr/local/libexec/sftp-server
然后kill掉sshd,再启动就可以用sftp-server了。


个人再加一个可能报错
Read from socket failed:Connection reaset by peer

通常,在linux中使用ssh的时候,如果出现这个错误,建议首先去查看log。

ubuntu的ssh的log记录在/var/log/auth.log


只要将/etc/ssh目录下的所有文件都修正为正确的权限即可。如果你不知道修改为多少,可以去看看你默认安装ssh成功后的目录权限。最好还是卸载了ssh再重新安装一次。


ssh 使用


禁用 SSH 远程主机的公钥检查

SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。

首先看看什么是 SSH 公钥检查

SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机:
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f.
Are you sure you want to continue connecting (yes/no)?
当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。 如果因为某种原因(服务器系统重装,服务器间IP地址交换,DHCP,虚拟机重建,中间人劫持),该IP地址的公钥改变了,当使用 SSH 连接的时候,会报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
Please contact your system administrator.
Add correct host key in /home/jiangxin/.ssh/known_hosts to get rid of this message.
Offending key in /home/jiangxin/.ssh/known_hosts:81
RSA host key for 192.168.0.110 has changed and you have requested strict checking.
Host key verification failed.
上面的警告信息说的是:
  • 服务器公钥已经改变,新的公钥的摘要是:e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
  • 该服务器原来的公钥记录在文件 ~/.ssh/known_hosts 中第 81 行。
如果确认不是中间人劫持,需要连接到该服务器,怎么办呢?最简单的就是用 vi 打开 ~/.ssh/known_hosts 文件,定位到 81 行,将该行删除。之后就可以使用 ssh 连接了。

如何让连接新主机时,不进行公钥确认?

在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断。或者由于  ~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。 SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:
Host *
 StrictHostKeyChecking no
或者在 ssh 命令行中用 -o 参数
$ ssh  -o StrictHostKeyChecking=no  192.168.0.110

如何防止远程主机公钥改变导致 SSH 连接失败

当确认中间人劫持攻击风险比较小的情况下,才可以使用下面的方法,禁用 SSH 远程主机的公钥检查。 SSH 客户端提供一个 UserKnownHostsFile 配置,允许指定不同的 known_hosts 文件。那么将 known_hosts 指向不同的文件,不就不会造成公钥冲突导致的中断了么?
$ ssh -o UserKnownHostsFile=/dev/null 192.168.0.110
The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
Are you sure you want to continue connecting (yes/no)?
看,提示信息由公钥改变中断警告,变成了首次连接的提示。 和之前提到的 StrictHostKeyChecking 配置配合使用,则不再有任何警告出现了:
$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110
Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts.
jiangxin@192.168.0.110's password:
如果设置了无口令 SSH 登录(即通过客户端公钥认证),就可以直接连接到远程主机。这是基于 SSH 协议的自动化任务常用的手段。
scp -rp root@192.168.0.169:/media/* root@192.168.0.176:/media
watch  -n 1 du -sh /media


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值