SSU_SSH&SCP使用说明


1. 交叉编译


ssh scp工具编译时依赖于openssl,zlib,编译ssh scp工具之前得先交叉编译openssl和zlib。

1.1. openssl交叉编译

1.1.1. 源码下载

openssl下载地址

版本:1.0.2

资源包下载完成后,解压进入opensl-1.0.2u目录,执行Configure配置文件配置编译工具链和指定相应的安装路径,如下:

./Configure --prefix=/home/xxxx/install/openssl os/compiler:gcc

make clean; make;

make install;

编译安装完成后会在prefix配置的目录下release相关的头文件和库文件。

1.2. zlib交叉编译

1.2.1. 源码下载

zlib下载地址

版本:1.2.11

1.2.2. 编译

资源包下载完成后,解压进入zlib-1.2.11目录,执行configure文件配置安装目录,如下:

./configure --prefix=/home/xxxx/install/zlib

修改Makefile编译脚本

CC=arm-linux-gnueabihf-gcc

LDSHARED=arm-linux-gnueabihf-gcc

CPP=arm-linux-gnueabihf-E

AR=arm-linux-gnueabihf-ar

make clean;make;

make install;

编译安装完成后会在prefix配置的目录下release相关的头文件和库文件。

1.3. ssh_scp_tool交叉编译

1.3.1. 源码下载

openssh下载地址

版本:5.6p1

资源包下载完成后,解压进入openssh-5.6p1目录,执行configure文件配置编译选项,如下:

./configure --host=arm-linux-gnueabihf --with-libs --with-zlib=../../ssh/install/zlib --with-ssl-dir=../../ssh/install/openssl --exec-prefix=/customer/ssh --prefix=/customer/ssh --disable-etc-default-login CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar

make clean;make;

编译完成后在该目录下会生成相应的可执行bin文件

编译选项说明:

--prefix=install architecture-independent files in PREFIX[/usr/local] (将体系无关文件安装到目录PREFIX里,默认是/usr/loacl)

--with-zlib= zlib安装路径

--with-ssl-dir=openssl 安装路径

--host= 交叉编译出来的程序运行的平台


2. 环境搭建


2.1. 目录文件夹,拷贝相关文件

mkdir /home/xxxx/target

在target目录下创建etc,lib,sbin目录

(1) 进入完成编译的openssh-5.6p1目录下,拷贝资源,执行命令如下:

cp moduli ssh_config sshd_config  /target/etc

cp sshd scp /target/sbin

(2) 在openssh-5.6p1目录下,执行命令如下,生成key值和拷贝相关的资源

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 ""

cp ssh_host_*_key /target/etc

(3) 相关库文件拷贝,执行命令如下:

从安装的zlib安装目录lib里拷贝libz.so到/target/lib目录下

从toolchain安装目录中相关库文件到/target/lib目录下,分别有:

libc/usr/lib/libcrypt.so

lib/lib/libresolv.so.2

libc/usr/lib/libutil.so

libc/usr/lib/libnss_files.so.2

libc/usr/lib/libnss_compat.so.2

2.2. 文件打包和启动配置

(1) 在/project/release/chip/p5/dispcam/common/glibc/6.4.0/bin/debug目录下新建一个ssh文件夹,将target目录下的sbin,etc,lib四个文件夹拷贝到工程代码里/project/release/chip/p5/dispcam/common/glibc/6.4.0/bin/debug目录下,代码工程编译时会自动拷贝到/customer目录下。

(2) 修改/target/etc/sshd_config,制定ssh_host_rsa_key, ssh_host_dsa_key默认路径和PermitEmptyPasswords参数

HostKey /customer/ssh/etc/ssh_host_rsa_key

HostKey /customer/ssh/etc/ssh_host_dsa_key

PermitEmptyPasswords yes

(3) 修改rootfs分区打包的脚本:

  1. 修改root用于默认密码为1234,用于ssh登陆;

    板子上使用的passwd root命令,密码为1234,系统会更改/etc/passwd文件,将/etc/passwd文件中的root一行拷贝即为root用户密码配置;

    Ps:要使用passwd root命令时,编译sdk配置rootfs不能为squashfs系统,squashfs为只读系统,passwd命令无法修改/etc/passwd文件

  2. 添加sshd用户,不然sshd启动会报错,即增加sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin;参考修改内容如下:


3. 测试验证


3.1. ssh验证

打开cmd或者xshell,输入 ssh root@172.xx.xx.xx,能够正常访问到设备shell的话,代表连接成功。

3.2. scp验证

打开cmd或者xshell,输入 scp root@172.xx.xx.xx,能够与PC机进行文件上传或者下载,代表scp使用正常。


4. 常用Q&A


Q1:使用scp时,报错Could not chdir to home directory /home/root:No such file or directory

此问题不影响scp的正常使用,可忽略。板子端做远端时,账号密码信息没有保存到/home目录下,需要把远端服务器rootfs改成可写文件系统,在/home下创建对应账号文件夹,scp会创建如下路径和文件且保存密钥。

Q2: 本地有scp命令或scp运行文件,但还是报sh:scp:not found

[SSD26X]此报错是指远端sh命令中没有scp,并不是指本地。scp会通过ssh给远端下scp cmd,从code中加打印可以看到命令如下:

板子做远端时,busybox下没有scp命令,所以执行此命令时会报找不到sh命令错误。在rootfs.mk加如上内容,打包的时候会把scp加到/bin下,可以在任意路径执行scp,解决报错问题。

Q3: 执行scp时板子上有libutil.so.1等scp依赖库,也声明了路径,把声明加到了/etc/profile和/etc/init.d/rcS,但还是会报无法打开库的错误

scp源码链接路径写死了,依赖的几个so库要放在rootfs的/lib目录下。在rootfs.mk加如上内容,打包的时候会把对应库打包到/lib下,解决如上报错。