LV015-openssh
有时候我们需要远程登录到开发板上对系统进行一些操作,这个时候就要使用到 SSH 服务。 SSH 是较可靠、专为远程登录会话和其他网络服务提供安全性的协议, OpenSSH 是 SSH 协议的免费开源版本,本节笔记就是在开发板中移植 OpenSSH,实现 SSH 服务。
一、OpenSSH 简介
1. 简介
SSH 全称为 Secure Shell(安全外壳协议,简称 SSH),是一种加密的网络传输协议,用于在不安全的网络中为网络服务提供安全的传输环境。 SSH 功能很强大,但是最常用的还是用于远程登录。 OpenSSH 是 SSH 协议的具体实现, OpenSSH 是一款开源、免费的 SSH 软件,提供了服务器端后台程序和客户端工具, OpenSSH 提供了很多程序,常用有以下几个:
(1)ssh:ssh 软件用于替换 rlogin 与 Telnet。
(2)scp 和 sftp:将文件复制到其他主机上,用于替换 rcp。
(3)sshd:SSH 服务器。
2. 源码获取
这里我们一共需要移植三个软件包: zlib、 openssl 和 openssh。依次到这三个软件的官网下载对应的源码,官网如下:
(1)zlib 官网:zlib Home Site
(2)openssl 官网:/source/index.html (openssl.org)
(3)openssh 官网:OpenSSH
前面两个前边都有移植过,就不赘述了,我们看一下 OpenSSH官网,写这篇文档的时候最新的版本是 9.3p2。我们可以在这里下载源码:OpenSSH: Release Notes

这两种包应该就是加密方式不同,功能应该是一样的。我就直接下载下边的 SHA256 的了,因为我发现前边移植 openssl 的时候我下载的 openssl 也有一个 SHA256 的标识,暂时还不知道这些需不需要对应,但是还是对应一下吧,万一有啥坑呢。下载完后解压会有很多文件:

二、移植 OpenSSH
1. 移植 zlib 库
2. 移植 openssl 库
3. 移植 OpenSSH
这里主要就是编译和安装啦。
3.1 交叉编译 openssh 库
我们执行以下命令:
cd ~/5ALPHA/openssh-9.3p2
./configure --host=arm-linux-gnueabihf \
--with-libs --with-zlib=/home/hk/5ALPHA/zlib-1.2.13/zlib_output \
--with-ssl-dir=/home/hk/5ALPHA/openssl-1.1.1v/openssl_output \
--disable-etcdefault-login \
CC=arm-linux-gnueabihf-gcc \
AR=arm-linux-gnueabihf-ar
make在配置 openssh 的过程中,“--with-zlib”参数用于指定 zlib 库所在的目录,“--with-ssl-dir”参数用于指定 openssl 库所在的目录,编译 openssh 的时候不用“make install”。编译完成后,是应该会在源码目录下生成以下文件:
scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan我们可以看一下:
cd ~/5ALPHA/openssh-9.3p2cd
ls -alh scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan sshd
3.2 将 openssh 相关文件拷贝到开发板中
openssh 交叉编译完成以后在开发板根文件系统中创建如下所示目录(如果存在的话就不需要创建):
cd ~/4nfs/buildroot/
mkdir -p usr/local/bin
mkdir -p usr/local/sbin
mkdir -p usr/local/libexec
mkdir -p usr/local/etc
mkdir -p var/run
mkdir -p var/empty上边这些命令是在 ubuntu 中的 nfs 根文件系统中执行的,后续介意直接写进开发板的根文件系统。创建完毕后我们将下边这些文件拷贝到 /usr/local/bin 目录中
cd ~/5ALPHA/openssh-9.3p2
cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan ~/4nfs/buildroot/usr/local/bin/将如下文件拷贝到开发板的/usr/local/sbin 目录下 :
cd ~/5ALPHA/openssh-9.3p2
cp sshd ~/4nfs/buildroot/usr/local/sbin/将如下文件拷贝到开发板的/usr/local/etc 目录下:
cd ~/5ALPHA/openssh-9.3p2
cp moduli ssh_config sshd_config ~/4nfs/buildroot/usr/local/etc将如下文件拷贝到开发板的/usr/local/libexec 目录下:
cd ~/5ALPHA/openssh-9.3p2
cp sftp-server ssh-keysign ~/4nfs/buildroot/usr/local/etc然后就是创建软连接,进入开发板中的/bin 目录下,输入如下命令创建软连接(这部分需要在开发板的串口终端下操作):
cd /bin/
ln -s /usr/local/bin/scp
ln -s /usr/local/bin/sftp
ln -s /usr/local/bin/ssh
ln -s /usr/local/bin/ssh-add
ln -s /usr/local/bin/ssh-agent
ln -s /usr/local/bin/ssh-keygen
ln -s /usr/local/bin/ssh-keyscan我们查看一下创建情况:
ls -alh scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan
再进入开发板的/sbin 目录下,输入如下命令创建软连接:
cd /sbin/
ln -s /usr/local/sbin/sshd
软连接创建完成以后就可以直接调用上面 ssh 相关命令了。在开发板串口终端打开 /usr/local/etc/sshd_config 文件,找到“#PermitRootLogin”所在行,将其改为“PermitRootLogin yes”。

3.3 openssh 设置
3.3.1 添加 sshd 用户
首先添加“sshd”用户,在使用 adduser 命令添加 sshd 用户的时候需要检查一些文件或目录是否存在。如果第一次添加用户的话要先将 ubuntu 下的/etc/passwd 和/etc/group 这两个文件复制到开发板根文件系统的对应目录,命令如下:
sudo cp -f /etc/passwd ~/4nfs/buildroot/etc/
sudo cp -f /etc/group ~/4nfs/buildroot/etc/
然后修改开发板根文件系统中的/etc/passwd 和/etc/group 这两个文件,只保留“root”这一项。 passwd 文件“root”行最后改为“/bin/sh”, 修改后的 passwd 和 group 文件内容如图

另外还需要创建几个目录和文件,都是在开发板的串口终端执行:
mkdir /home
mkdir -p /usr/share/empty
mkdir -p /var/log当所需的文件都存在以后就可以使用 adduser 创建名为“sshd”的用户了,创建 sshd 用户的时候需要设置密码,一定要记得这个密码,这里我设置简单一点,为“123456”,创建过程如图 :

3.3.2 在开发板上生成秘钥文件
一切准备好以后我们还需要在开发板中生成秘钥文件,使用我们上面移植 openssh 所编译出来的 ssh-keygen 软件即可。从串口终端进入到开发板的 /usr/local/etc 目录下,输入如下所示命令生成秘钥文件,由于 IMX6ULL 性能比较差,有些秘钥文件生成过程可以会有点耗时,打开几十秒:
cd /usr/local/etc
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-keygen -t ed25519 -f ssh_host_ed25519_key -N ""完成以后就会在/usr/local/etc 目录下产生 8 个以“ssh_host_”开头的秘钥文件,如图 :

4. 启动 openssh
openssh 移植已经移植到了开发板中,我们可以通过 sshd 软件在开发板上搭建 openssh 服务器,然后在其他的主机上通过 ssh 来登录开发板。我们可以同样使用 scp 命令来向开发板传输文件。首先要在开发板上启动 ssh 服务, sshd 软件用于启动 ssh 服务,注意要输入全路径!输入如下命令:
/sbin/sshd # 启动 sshd 服务也可以在 /etc/init.d/rcS 文件中加入如下命令,实现 ssh 服务开机自启动:
/sbin/sshd &然后启动的时候好像就报错了:

好像是权限问题,可以这样处理:
mkdir -p /var/empty/sshd # 没有这个目录可以直接创建
chown -R root.root /var # 修改用户组
chown -R root.root /var/empty # 修改用户组
chown -R root.root /var/empty/sshd # 修改用户组
chmod 744 /var/empty/sshd # 修改权限
chmod 744 /var/empty # 修改权限可以使用下边的命令查看一下 /var/empty/sshd 目录情况:
# ls -ld /var
drwxr--r-- 5 root root 4096 Aug 6 2023 /var
# ls -ld /var/empty/
drwxr--r-- 3 root root 4096 Aug 6 2023 /var/empty/
# ls -ld /var/empty/sshd/
drwxr--r-- 2 root root 4096 Aug 6 2023 /var/empty/sshd/三、ssh 登录使用
启动以后我们就可以使用 XobaXterm、 SecureCRT 等终端软件通过 SSH 服务登录开发板,我们先看一下开发板的 ip 地址:
# ifconfig
eth0 Link encap:Ethernet HWaddr B8:AE:1D:01:00:00
inet addr:192.168.10.102 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::baae:1dff:fe01:0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4238 errors:0 dropped:0 overruns:0 frame:0
TX packets:3418 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4703475 (4.4 MiB) TX bytes:490768 (479.2 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)1. MobaXterm 登录开发板
我们使用 MobaXterm 来连接一下试试:

配置完成以后点击“OK”按钮,此时就会打开 ssh 会话框 ,输入 sshd 用户密码:

可能会弹出是否保存密码对话框,选择保存即可。如果密码正确的话就会登录到开发板上

登陆成功的哈如下图所示:

2. ubuntu 登录开发板
同样的,我们也可以在 ubuntu 下通过 ssh 命令登录开发板,输入如下命令:
ssh sshd@192.168.10.102然后会让输入密码,密码正确就也可以登录开发板啦,前提是 ubuntu 和开发板在同一网段,可以 ping 通。

输入“exit”命令即可退出 SSH 会话
3. scp 命令拷贝文件
如果我们要向开发板发送一个文件,我们可以通过 TF 卡或者 U 盘来中转,或者通过 tftp 来发送。我们移植 openssh 的时候也编译出来了一个名为“scp”的命令,所以我们可以在开发板中使用 scp 命令向其他主机发送文件,同样的其他主机也可以使用 scp 命令向开发板发送文件。比如我们要把 ubuntu 中的一个文件发送到开发板中,输入如下命令即可:
scp local_file remote_username@remote_ip:remote_folder例如:
# 在 ubuntu 中执行
touch hello.c
scp hello.c sshd@192.168.10.102:/home/sshd/scp_file # /home/sshd/scp_file 目录要做存在
然后我们看一下开发板对应的目录是否已经有这个文件了(下图是在串口终端看的)
