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

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>在移植到友善2440的时候很容易,因为他4.3.2交叉编译器等库文件做等好。但是在移植到天漠devkit8000时,遇到非常多的问题。一个月之前遇到问题没有找到-lgcc_s的问题一直没有解决,以致后来非常影响开发进度。最近决心解决这个问题,在google上查到没有找到lxx其实时没有找到libxxx.so,然后与友善2440比较了下,发现果真是<span style="word-wrap:normal; word-break:normal"><span style="word-wrap:normal; word-break:normal">arm-none-linux-gnueabi/</span></span>libc/lib下缺少libgcc_s.so。最后一步问题总结是我编译的时候遇到等所有问题,后一一化解,成功移植。所以,如果你在编译等时候出错,查看最后的<span style="word-wrap:normal; word-break:normal">问题总结</span>,应该可以找到答案。<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
 步骤:
 1.下载源码包,地址如下:
 
 openssh <wbr><a href="http://www.openssh.com/portable.html">http://www.openssh.com/portable.html</a><br> openssl <wbr><a href="http://www.openssl.org/source">http://www.openssl.org/source</a><br> zlib<wbr><wbr><wbr><wbr><wbr><a href="http://www.zlib.net/">http://www.zlib.net/</a></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 
 
 2.交叉编译
 创建工作目录:
 
 #mkdir /work
 #cd /work 
 

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

 交叉编译 zlib:
# cd<wbr>/work/ssh/source/zlib-1.2.3<br> # ./configure --prefix=/work/ssh/install/zlib-1.2.3<br> # vim Makefile<br> CC=arm-none-linux-gnueabi-gcc<br> AR=arm-none-linux-gnueabi-ar rc<br> CPP =arm-none-linux-gnueabi-gcc -E<br> LDSHARED=arm-none-linux-gnueabi-gcc</wbr> # make
 # make install 交叉编译openssl
# cd<wbr>/work/ssh/source/openssl-0.9.8e<br> # ./Configure --prefix=/work/ssh/install/openssl-0.9.8e<wbr>os/compiler:arm-none-linux-gnueabi-gcc</wbr></wbr> # make
 # make install 
 交叉编译openssh 
 
 
 # cd<wbr>/work/ssh/source/ openssh-4.6p1<br> #./configure --host=arm-none-linux-gnueabi<wbr>--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<br> #make<br> 注意:openssh不需要make install</wbr></wbr> 
 
 3.操作目标板
 3.1确保目标板上有以下目录,若没有,则新建:
 
 
 /usr/local/sbin/<wbr></wbr> 

 
 
 /usr/local/etc/<wbr></wbr> 

 
 
 /usr/local/libexec/<wbr></wbr> 

 
 
 /var/run/<wbr></wbr> 

 
 3.2从PC机上将以下文件拷贝到目标板Linux系统中
 PC机 /work/ssh/source/openssh-4.6p1/ 目录下的
 scp<wbr>sftp<wbr>ssh<wbr>ssh-add<wbr>ssh-agent<wbr>ssh-keygen<wbr>ssh-keyscan</wbr></wbr></wbr></wbr></wbr></wbr>拷贝到目标板/usr/local/bin
 moduli ssh_config sshd_config拷贝到目标板 /usr/local/etc
 sftp-server<wbr>ssh-keysign</wbr>拷贝到目标板 /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 -fssh_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)<wbr></wbr>

 问题分析:说明你编译等时候指定等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<wbr>inside</wbr>,解决:ln -s ld-2.5.so<wbr>ld-linux.so.3</wbr> 

 
 
 
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。
 解决办法:按照操作步骤,运行:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ssh-keygen -t dsa -f ssh_host_das_key -N ""<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>ssh-keygen -t ecdsa -f ssh_host_ecdas_key -N ""<br> 生成ssh_host_das_key 和ssh_host_ecdas_key后复制到目标板/usr/local/etc/目录下。<br><br><span style="word-wrap:normal; word-break:normal">6.从nfs复制key文件到usr/local/etc时出现:</span><br><span style="word-wrap:normal; word-break:normal">cp: can't open 'ssh_host_dsa_key': Permission denied</span><br><br> 问题分析:目标板复制权限不够。<br> 解决办法:在主机中修改他们等权限为777,命令:chmod 777 *<wbr><wbr><wbr><wbr>。然后再复制。<br><br><span style="word-wrap:normal; word-break:normal">7.<span style="word-wrap:normal; word-break:normal">Privilege separation user sshd does not exist</span></span><br> //需要在开发板的系统里adduser shhd<br> //或者在/etc/passwd 中添加下面这一行<br> sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin<br><br><span style="word-wrap:normal; word-break:normal">8.<span style="word-wrap:normal; word-break:normal">Permissions 0755 for '/usr/local/etc/ssh_host_dsa_key' are too open.</span></span><br> //则把目标板/usr/local/etc/下的ssh_host_*几个文件的权限改为700。如果出现权限不够问题,用su - root进入root用户再改。<br> 命令:#chmod 700 ssh_host_*<br><br><span style="word-wrap:normal; word-break:normal">9.<span style="word-wrap:normal; word-break:normal">Permission denied (publickey,password,keyboard-interactive).</span></span><br> //打开开发板/usr/local/sshd_config,将PermitRootLogin yes前的注释“#”号去掉。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr> 
 

 
 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 使用
 

 
原文连接 http://www.worldhello.net/2010/04/08/1026.html
 

 
 
 
 禁用 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:
 
 
scp -rp root@192.168.0.169:/media/* root@192.168.0.176:/media 
  
 
 
 
  
watch  -n 1 du -sh /media