SSH(Secure SHell)交叉编译以及服务器客户端配置
主要介绍SSH( Secure Shell)的在嵌入式平台的交叉编译方法,远程登录、文件传输和端口通路的方式以及常用开源实现OpenSSH和Dropbear的实现和连接方式。
关键字: ssh server openssh dropbear client telnet 交叉编译
简介
SSH( Secure Shell)是允许远程登录、文件传输和端口通路的保密通信协议,在标准RFC 4251, 4252, 4253 中4254统一定义了,可以用来替代telnet,rlogin,rsh等协议。在Linux平台上主要的实现是OpenSSH,包括服务器server和客户端client。一个精简的实现叫做Dropbear也可以很方便的得到。Openssh和dropbear都能很方便的在嵌入式平台交叉编译和移植,有了这些ssh的服务器和客户端,就能容易的进行嵌入式开发;在Windows平台,Putty是一个免费的SSH客户端。
安装和基本使用方法
在GNU/Linux的发行版本中,OpenSSH是有单独的包可以的,如在Ubuntu中,有客户端的应用程序包openssh-server,以及客户端应用程序包openssh-client。访问ssh服务器非常简单,通过下面的命令即可
ssh username@hostname
然后ssh会提示输入用户密码,就能登录远程系统了。
文件传输和X界面访问
文件传输可以通过scp客户端应用程序来实现。
scp myfile1 myfile2 username@hostname:~/dest/directory/
scp -r mydirectory user@host:~/dest/
通过ssh -X选项,可以告诉 ssh来使能X11 传输。这样就能在server端运行的图形界面程序通过远程传输到客户端显示。在远程主机上,X11Forwarding必须在/etc/ssh/sshd_config中使能。
远程执行
Ssh本金能远程连接到host,还能远程执行命令。如
ssh user@host ls
这种远程执行在shell脚本中非常有用。Ssh还能被其他应用程序当做 一个传输层,如rsync,同步工具可以使用ssh
rsync -e ssh ~/work user@workhost:~/work
使用keys来跳过密码输入
使用ssh的一个特性是通过加密keys来忽略密码输入。首先产生SSH私钥和公钥:
ssh-keygen -t dsa
这会提示你输入一个口令字符串,该字符串将在你使用时开启你的私钥。
产生的密钥在~/.ssh/id_dsa下,私钥应该没有人能有访问权限。公钥~/.ssh/id_dsa.pub可以传输到你需要访问的各个主机host。
ssh-copy-id user@host
公钥被传输到远程主机后,可以在~/.ssh/authorized_keys加入你的公钥,这样每次连接时就能用密钥来代替输入密码了。
ssh-agent可以让你不必每次连接都输入密码,可以把密码字符串保存到存储空间一段时间。
使用 $(eval ssh-agent)可以运行ssh-agent程序设置一些环境变量,这样其他的ssh程序就能访问agent了。
使用ssh-add可以把密码告诉给agent,其他的ssh程序可以直接登录远程主机而不用输入密码。
使用ssh-agent设置的环境变量会在你退出当前shell时失效,所以最好是在开启X server之前就启动ssh-agent,那样就能让你的应用程序访问那些环境变量了。这些在常见的Linux发型版本都是默认设置的,如Ubuntu里文件 /etc/X11/Xsession.options中定义了 use-ssh-agent选项。在/etc/X11/Xsession.d/中会启动该agent如果设置了这个选项。
更方便的使用agent的方式是安装一个图像界面的ssh-add程序: ssh-askpass-gnome(Gnome)或者ksshaskpass( KDE),这样会在图形环境启动时自动运行ssh-add。
端口隧道
Ssh可以链路端口,可以在本地建立一个通过ssh连接到另外一个host的远程连接端口
ssh -L 12345:localhost:25 user@host
然后任何连接到本地端口的12345会直接通过加密隧道链路到目标主机的25端口。
建立一个连接到远程主机的端口,通过ssh连接到本地主机:
ssh -R 4242:kernel.org:80 user@host
这样任何链接到远程端口4242就会通过加密隧道连接到kernel.org的80端口了
配置文件
SSH在~/.ssh/config里保存了一个配置文件,会配置全局选项,以及针对每个host的配置选项。像如下的host信息。
Host myhost0
HostName 192.168.0.2
User root
有了这些选项,使用 "ssh myhost0"就会直接使用root登录连接到 IP 192.168.0.2。
arm-linux下ssh的移植
首先确定已经
- 你的本机上建立好了arm-linux交叉编译环境 #arm-linux-gcc -v
- 开发板已与路由器相连,并进行了必要的网络配置,可以ping通本机
1. 下载需要的源码
mkdir -p ~/arm/fs ;mkdir -p ~/arm/source
下载zlib: zlib-1.2.3.tar.gz
下载ssl : openssl-0.9.8d.tar.gz
下载ssh : openssh-5.6p1.tar.gz
2. 编译:
cd ~/arm/source
(1) 编译zlib :
tar zxvf zlib-1.2.3.tar.gz -C .
cd zlib-1.2.3/
./configure –prefix=/home/itlanger/arm/fs/zlib-1.2.3
修改Makefile :
CC=gcc 改为:
CROSS=/usr/local/arm/3.4.1/bin/arm-linux -
CC= $ ( CROSS) gcc
LDSHARED= gcc 改为: LDSHARED= $ ( CROSS) gcc
CPP= gcc - E 改为 : CPP= $ ( CROSS) gcc - E
AR= ar rc 改为: AR= $ ( CROSS) ar rc
开始编译: make;
make install
(2) 编译openssl:
tar zxvf openssl-0.9.8d.tar.gz
. / configure - - prefix= / home/itlanger / arm/fs/ openssl- 0. 9. 8d
os/ compiler: / usr/ local/ arm/ 3. 4. 1/ bin/ arm- linux- gcc
make
make install
(3) 编译openssh:
tar zxvf openssh-4.6p1.tar.gz
cd openssh-4.6p1/
./configure –host=arm-linux –with-libs –with-zlib=/home/itlanger/arm/fs/zlib-1.2.3
–with-ssl-dir=/home/itlanger/arm/fs/openssl-0.9.8d –disable-etc-default-login
CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc AR=/usr/local/arm/3.4.1/bin/arm-linux-ar
make
##不要make install
3. 安装
(1) 将 openssh-4.6p1目录下的 sshd 拷贝到 目标板的/usr/sbin目录下
(2) 再copy scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan 到目标板/usr/local/bin 目录下
copy sftp-server ssh-keysign 到/usr/local/libexec
(3) 在目标板下:
mkdir -p /usr/local/etc/
然后将openssh下的sshd_config , ssh_config 拷贝到该目录下
mkdir -p /var/run; mkdir -p /var/empty/sshd
chmod 755 /var/empty
(4)在主机上:
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_host_* 4个文件copy到目标板的 /usr/local/etc/目录下
(5) 添加用户:
将主机上 /etc/ 目下的 passwd, shadow, group 三个文件copy到目标板的 /etc 目录下, 同时记得将passwd的最后 /bin/bash 该为 /bin/sh
//这一步以后,开发板上的用户结构与你本机的结构就是一样的了,所以在cp之前先把你自己的root密码设好
//#passwd设置root密码,然后在把上面3个文件cp到开发板/etc下
其实可以删除不需要的一些用户。
4.测试
目标板启动sshd: # /usr/sbin/sshd
//在开发板上运行这个命令的时候可能会提示
//Privilege separation user sshd does not exist
//需要在开发板的系统里adduser shhd
//或者在 /etc/passwd 中添加下面这一行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
主机: $ ssh root@192.168.0.34(开发板的ip) //root密码就是你本机上root的密码
ps: 红色的那些代表让arm做ssh server时必须的
ARM平台的Dropbear交叉编译
-
所需软件
Zlib: http://www.zlib.net/ Zlib
Dropbear: http://www.ucc.asn.au/~matt/dropbear/dropbear.html
- 编译过程
编译zlib:
wget http://www.zlib.net/zlib-1.2.3.tar.gz
tar zxvf zlib-1.2.3.tar.gz
mkdir zlib
cd zlib-1.2.3/
CC=arm-linux-gcc ./configure --prefix=/data/build-tools/zlib
make
make install
编译dropbear:
wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.51.tar.gz
tar zxvf dropbear-0.51.tar.gz
mkdir dropbear-build
cd dropbear-build/
mkdir build
../dropbear-0.51/configure --prefix=/data/build-tools/dropbear-build/build/ \
--with-zlib=/data/build-tools/zlib/ CC= arm-linux-gcc --host=arm
make
make scp
sudo make install
sudo cp scp build/bin/
其中的scp需要单独编译,然后用把编译好的scp复制到build/bin目录下。
在交叉编译好的程序要使用 file 之类的工具检查一下是否为目标机器的程序:
OMAP3@beagle:/data/build-tools/dropbear-build$ file scp
scp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32,
dynamically linked (uses shared libs), not stripped
编译好的文件目录结构为:
border@b0rder: /data /build-tools/dropbear-build/build$ tree
.
|-- bin
| |-- dbclient
| |-- dropbearconvert
| |-- dropbearkey
| `-- scp
`-- sbin
`-- dropbear
生成server key:
cd /etc
mkdir dropbear
cd dropbear
dropbearkey -t rsa -f dropbear_rsa_host_key
dropbearkey -t dss -f dropbear_dss_host_key
3.启动脚本
把build目录拷贝到ARM机器上, 在启动脚步/etc/init.d/rcS中增加:
dropbear
编译错误信息以及解决方法
- configure: error: *** zlib missing - please install first or check config.log ***
安装ssh时出现了 :configure: error: *** zlib missing - please install first or check config.log *** 错误信息
解决办法:apt-get install zlib1g-dev |
3. configure: error: *** OpenSSL headers missing - please install first or check config.log openssh
解决办法: apt-get install openssl-devel并且确认安装路径是对的,即--with-ssl-dir=设置的是正确的路径;
-
启动sshd提示: Privilege separation user sshd does not exist
方法一(推荐): 注意ssh设置的路径可能有所不同
修改/etc/passwd文件,在其中加入
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
或者
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
我加入的是:
sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
参考
http://www.unixguide.net/comments/sun/ssh_installation.shtml/37.shtml
http://www.gipsky.com/modules/newbb/viewtopic.php?topic_id=966
方法二(不推荐):
修改/etc/ssh/sshd_config文件
将其中
UsePrivilegeSeparation yes
修改为
UsePrivilegeSeparation no
虽然能解决问题,但是降低了ssh的安全级别。
Reference
http://zh.wikipedia.org/zh/SSH
http://zh.wikipedia.org/wiki/SSH
http://en.wikipedia.org/wiki/Secure_Shell
http://www.openssh.com/
http://en.wikipedia.org/wiki/Drop_bear
http://matt.ucc.asn.au/dropbear/dropbear.html
http://www.blog.163.com/houh-1984/
总结:
主要介绍SSH( Secure Shell)的在嵌入式平台的交叉编译方法,远程登录、文件传输和端口通路的方式以及常用开源实现OpenSSH和Dropbear的实现和连接方式。