SSH(Secure SHell)交叉编译以及服务器客户端配置

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的移植

首先确定已经

  1. 你的本机上建立好了arm-linux交叉编译环境 #arm-linux-gcc -v
  2. 开发板已与路由器相连,并进行了必要的网络配置,可以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交叉编译

  1. 所需软件

    Zlib: http://www.zlib.net/ Zlib

    Dropbear: http://www.ucc.asn.au/~matt/dropbear/dropbear.html

  2. 编译过程

编译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

编译错误信息以及解决方法

  1. 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
          apt-get install libssl-dev
解决办法: apt-get install libz-dev

2. 另外一种情况,错误信息和解决方法如下:

错误:error: *** Can't find recent OpenSSL libcrypto (see config.log for details) ***
执行: apt-cache search openssl | grep dev 查找到要安装的openssl包,你应该会得到如下信息。
-------------------------------------------
libcurl3-dev - Transitional package to libcurl3-openssl-dev
libcurl3-openssl-dev - Development files and documentation for libcurl
libaws-dev - Ada Web Server development files
libssl-ocaml-dev - OCaml bindings for OpenSSL
libssl-dev - SSL development libraries, header files and documentation
-------------------------------------
其中dev前面的就是所要安装的包。你可以把这些包写到一个文件里,让他们自动安装。
vim ssl
增加以下内容:
sudo apt-get install bcurl3-dev;
sudo apt-get install libcurl3-openssl-dev;
sudo apt-get install libaws-dev;
sudo apt-get install libssl-ocaml-dev;
sudo apt-get install libssl-dev;
:wq
然后chmod 775 ssl
./ssl
可能会让你输入root口令。还有中间有几步要你手动输入一下yes.
这样,openssl就安装上了,可以继续安装openssh了。

3. configure: error: *** OpenSSL headers missing - please install first or check config.log openssh

解决办法: apt-get install openssl-devel并且确认安装路径是对的,即--with-ssl-dir=设置的是正确的路径;

  1. 启动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的实现和连接方式。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值