`
xitong
  • 浏览: 6179038 次
文章分类
社区版块
存档分类
最新评论

ARM 开发板 ssh 移植

 
阅读更多

编译器arm-linux-gccarm-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/bin/<wbr></wbr>
/usr/local/sbin/<wbr></wbr>
/usr/local/etc/<wbr></wbr>
/usr/local/libexec/<wbr></wbr>
/var/run/<wbr></wbr>
/var/empty/

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


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




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics