同学考研,买了块arm9的开发板没时间玩儿,就借给奶牛玩儿了,昨晚开始折腾,先从移植开始,最开始折腾的axel,比较容易移植。之后的今天就开始搞ssh的移植了,选择的openssh,从网上查了一些教程,虽然他们也写了也总结了,但是问题依旧是存在滴。好吧,奶牛就把自己做的总结下吧。
首先说移植的目的:有了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