Skip to content

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

image-20230806111448332

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

image-20230806111753752

二、移植 OpenSSH

1. 移植 zlib 库

2. 移植 openssl 库

3. 移植 OpenSSH

这里主要就是编译和安装啦。

3.1 交叉编译 openssh 库

我们执行以下命令:

shell
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”。编译完成后,是应该会在源码目录下生成以下文件:

shell
scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan

我们可以看一下:

shell
cd ~/5ALPHA/openssh-9.3p2cd 
ls -alh scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan sshd
image-20230806112823905

3.2 将 openssh 相关文件拷贝到开发板中

openssh 交叉编译完成以后在开发板根文件系统中创建如下所示目录(如果存在的话就不需要创建):

shell
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 目录中

shell
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 目录下 :

shell
cd ~/5ALPHA/openssh-9.3p2
cp sshd ~/4nfs/buildroot/usr/local/sbin/

将如下文件拷贝到开发板的/usr/local/etc 目录下:

shell
cd ~/5ALPHA/openssh-9.3p2
cp moduli ssh_config sshd_config ~/4nfs/buildroot/usr/local/etc

将如下文件拷贝到开发板的/usr/local/libexec 目录下:

shell
cd ~/5ALPHA/openssh-9.3p2
cp sftp-server ssh-keysign ~/4nfs/buildroot/usr/local/etc

然后就是创建软连接,进入开发板中的/bin 目录下,输入如下命令创建软连接(这部分需要在开发板的串口终端下操作):

shell
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

我们查看一下创建情况:

shell
ls -alh scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan
image-20230806113943540

再进入开发板的/sbin 目录下,输入如下命令创建软连接:

shell
cd /sbin/
ln -s /usr/local/sbin/sshd
image-20230806114038415

软连接创建完成以后就可以直接调用上面 ssh 相关命令了。在开发板串口终端打开 /usr/local/etc/sshd_config 文件,找到“#PermitRootLogin”所在行,将其改为“PermitRootLogin yes”。

image-20230806114252117

3.3 openssh 设置

3.3.1 添加 sshd 用户

首先添加“sshd”用户,在使用 adduser 命令添加 sshd 用户的时候需要检查一些文件或目录是否存在。如果第一次添加用户的话要先将 ubuntu 下的/etc/passwd 和/etc/group 这两个文件复制到开发板根文件系统的对应目录,命令如下:

shell
sudo cp -f /etc/passwd  ~/4nfs/buildroot/etc/ 
sudo cp -f /etc/group ~/4nfs/buildroot/etc/
image-20230806114646846

然后修改开发板根文件系统中的/etc/passwd 和/etc/group 这两个文件,只保留“root”这一项。 passwd 文件“root”行最后改为“/bin/sh”, 修改后的 passwd 和 group 文件内容如图

image-20230806115439407

另外还需要创建几个目录和文件,都是在开发板的串口终端执行:

shell
mkdir /home
mkdir -p /usr/share/empty
mkdir -p /var/log

当所需的文件都存在以后就可以使用 adduser 创建名为“sshd”的用户了,创建 sshd 用户的时候需要设置密码,一定要记得这个密码,这里我设置简单一点,为“123456”,创建过程如图 :

image-20230806115603426
3.3.2 在开发板上生成秘钥文件

一切准备好以后我们还需要在开发板中生成秘钥文件,使用我们上面移植 openssh 所编译出来的 ssh-keygen 软件即可。从串口终端进入到开发板的 /usr/local/etc 目录下,输入如下所示命令生成秘钥文件,由于 IMX6ULL 性能比较差,有些秘钥文件生成过程可以会有点耗时,打开几十秒:

shell
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_”开头的秘钥文件,如图 :

image-20230806115952906

4. 启动 openssh

openssh 移植已经移植到了开发板中,我们可以通过 sshd 软件在开发板上搭建 openssh 服务器,然后在其他的主机上通过 ssh 来登录开发板。我们可以同样使用 scp 命令来向开发板传输文件。首先要在开发板上启动 ssh 服务, sshd 软件用于启动 ssh 服务,注意要输入全路径!输入如下命令:

shell
/sbin/sshd # 启动 sshd 服务

也可以在 /etc/init.d/rcS 文件中加入如下命令,实现 ssh 服务开机自启动:

shell
/sbin/sshd &

然后启动的时候好像就报错了:

image-20230806120311058

好像是权限问题,可以这样处理:

shell
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 目录情况:

shell
# 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 地址:

shell
# 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 来连接一下试试:

image-20230806121730501

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

image-20230806121927850

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

image-20230806121850731

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

image-20230806122017577

2. ubuntu 登录开发板

同样的,我们也可以在 ubuntu 下通过 ssh 命令登录开发板,输入如下命令:

shell
ssh sshd@192.168.10.102

然后会让输入密码,密码正确就也可以登录开发板啦,前提是 ubuntu 和开发板在同一网段,可以 ping 通。

image-20230806122300837

输入“exit”命令即可退出 SSH 会话

3. scp 命令拷贝文件

如果我们要向开发板发送一个文件,我们可以通过 TF 卡或者 U 盘来中转,或者通过 tftp 来发送。我们移植 openssh 的时候也编译出来了一个名为“scp”的命令,所以我们可以在开发板中使用 scp 命令向其他主机发送文件,同样的其他主机也可以使用 scp 命令向开发板发送文件。比如我们要把 ubuntu 中的一个文件发送到开发板中,输入如下命令即可:

shell
scp local_file remote_username@remote_ip:remote_folder

例如:

shell
# 在 ubuntu 中执行
touch hello.c
scp hello.c sshd@192.168.10.102:/home/sshd/scp_file # /home/sshd/scp_file 目录要做存在
image-20230806123113752

然后我们看一下开发板对应的目录是否已经有这个文件了(下图是在串口终端看的)

image-20230806123347761