需要打包好的文件请留邮箱
参考文章(一)
原文链接: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
然后配置好交叉编译工具
- mkdir source package
- mkdir package/zlib
- mkdir package/openssl
- mv openssh-6.p1.tar.gz openssl-1.0.1c.tar.gz zlib-1.2.7.tar.gz ./source
- cd source
- tar xzvf openssh-6.p1.tar.gz
- tar xzvf openssl-1.0.1c.tar.gz
- tar xzvf zlib-1.2.7.tar.gz
1.编译zlib
- ./configure --prefix=/home/nenew/package/zlib
修改Makefile
- CC=arm-linux-gcc
- AR=arm-linux-ar
- CPP =arm-linux-gcc -E
- LDSHARED=arm-linux-gcc
就是讲gcc ar用arm-linux-gcc arm-linux-ar来代替
- make
- make install
2.编译openssl
- ./Configure --prefix=/home/nenew/package/openssl os/compiler:arm-linux-gcc
这里可以直接指定交叉编译器,如果想知道哪些编译文件可以直接支持的话,一般./configure –help就可以看到说明
- make
- make install
3.编译openssh
- ./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的路径也就是我们刚才的安装路径,最后指定交叉编译器
- make
这里并不安装,理由是不需要安装,安装到本机也无法执行,因为我们是交叉编译,你也许会问,为什么不直接换个预置安装目录来安装呢?如果不动手做你是不会知道的,sshd启动的时候会去安装目录下的etc找配置文件滴,所以这个目录不要随便指定,网上那些教程很多这里的路径都是有问题的。
编译工作至此结束,可以开始移植openssh了。
- mkdir -p usr/local/openssh
- cd usr/local/openssh
- mkdir etc bin
- cd ../../../
- cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan ./usr/local/openssh/bin
- cp sshd_config ssh_config ./usr/local/openssh/etc
- mkdir sbin bin
- cp sshd ./sbin
- cd bin
- ln -s /usr/local/openssh/bin/scp
- ln -s /usr/local/openssh/bin/sftp
- ln -s /usr/local/openssh/bin/ssh
- ln -s /usr/local/openssh/bin/ssh-add
- ln -s /usr/local/openssh/bin/ssh-agent
- ln -s /usr/local/openssh/bin/ssh-keygen
- ln -s /usr/local/openssh/bin/ssh-keyscan
- cd ..
- mkdir -p usr/local/libexec
- cp sftp-server ssh-keysign usr/local/libexec
- mkdir ../final
- cp -r bin sbin usr ../final
- cd ../final
- tar czvf openssh.tgz ./
目录结构大体如下:
这就把需要拷贝的文件都准备好了,传到开发板的目录下,然后展开到/根。
这时候ssh并不能运行,还需要修改passwd与group文件,位置在/etc下,将sshd用户添加上。
passwd照着模样修改:
sshd::15:50:::/bin/sh
group照着模样修改:
sshd:*:50:
这里的两个50要对应,是组的编号
- mkdir -p /var/run/sshd
然后就是配置ssh key了。
- cd /usr/local/openssh/etc
- 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 ""
- 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-gcc和arm-none-linux-gnueabi-gcc成功。
步骤:
1.下载源码包,地址如下:
opensshopenssl
zlib
2.交叉编译
创建工作目录:
#mkdir /work#cd /work
在/work目下面创建ssh目录
# mkdir /work/lib
# mkdir /work/ssh
# cd
# mkdir compressed install source
#mv tarpakgs/openssh-4.6p1.tar.gz
#mv tarpakgs/openssl-0.9.8e.tar.gz
#mv tarpakgs/zlib-1.2.3.tar.gz
解压安装包:
# cd /work/ssh/compressed/# tar zxvf zlib-1.2.3.tar.gz
# tar zxvf openssl-0.9.8e.tar.gz
# tar zxvf openssh-4.6p1.tar.gz
交叉编译 zlib:
# cd
# ./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
# ./Configure --prefix=/work/ssh/install/openssl-0.9.8e
# make
# make install
# cd
#./configure --host=arm-none-linux-gnueabi
#make
注意:openssh不需要make install
3.操作目标板
3.1确保目标板上有以下目录,若没有,则新建:
/usr/local/bin/3.2从PC机上将以下文件拷贝到目标板Linux系统中
PC机 /work/ssh/source/openssh-4.6p1/ 目录下的
scp
moduli ssh_config sshd_config拷贝到目标板 /usr/local/etc
sftp-server
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,然后输入密码即可。
登录成功后如下图:
问题总结
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
问题解析:
解决办法:
可能一解决:查找/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,此问题可以解决。如果再出现以下问题:
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_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这两行函数。
通常,在linux中使用ssh的时候,如果出现这个错误,建议首先去查看log。
ubuntu的ssh的log记录在/var/log/auth.log
禁用 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 行。
如何让连接新主机时,不进行公钥确认?
在首次连接服务器时,会弹出公钥确认的提示。这会导致某些自动化任务,由于初次连接服务器而导致自动化任务中断。或者由于 ~/.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 协议的自动化任务常用的手段。
watch -n 1 du -sh /media