首页 > 解决方案 > 在受限嵌入式系统上使用 sshd 启动子系统进程

问题描述

我正在尝试yuma123在嵌入式 Linux 系统上运行 NETCONF 服务器的开源实现。

NETCONF 服务器使用sshd, 并且yuma123似乎假定它是 的openssh实现,sshd因为它使用了该/etc/ssh/sshd_config文件。

特别是,README文件中的yuma123状态:

Tell sshd to listen on port 830. Add the following 2 lines to /etc/ssh/sshd_config:

Port 830
Subsystem netconf "/usr/sbin/netconf-subsystem --ncxserversockname=830@/tmp/ncxserver.sock"

但是,由于内存限制,嵌入式系统目前使用dropbear缩减的实现,并且由于可执行文件、依赖库等的大小sshd,我很难openssh(同时yuma123)安装在嵌入式系统上。

我可以获取/修改dropbear sshd给我类似的功能吗?我可以大幅削减openssh sshd到足够小的尺寸吗?关于解决此问题的好方法的任何(其他)建议?

标签: embedded-linuxopensshsshdietf-netconfdropbear

解决方案


根据dropbear 源代码,dropbear SSH 服务器内置的唯一子系统是对 SFTP 的可选支持,我将在下面描述。

支持另一个子系统需要对 dropbear 进行源代码更改。如果这是一个选项,则有问题的代码在sessioncommand()文件svr-chansession.c中的函数中:

#if DROPBEAR_SFTPSERVER
            if ((cmdlen == 4) && strncmp(chansess->cmd, "sftp", 4) == 0) {
                m_free(chansess->cmd);
                chansess->cmd = m_strdup(SFTPSERVER_PATH);
            } else 
#endif
            {
                m_free(chansess->cmd);
                return DROPBEAR_FAILURE;
            }

基本上,您将添加一些类似于“sftp”部分的代码,用于检查您的子系统名称并调用所需的命令。

如果您不想构建自定义版本的 dropbear,那么您也许可以使用强制命令。有两种方法可以做到这一点。

如果该子系统的用户将使用 SSH 密钥进行身份验证,那么您可以在用户authorized_keys文件中放置一个“命令”指令:

command="/usr/sbin/netconf-subsystem..." ssh-rsa AAAAB3NzaC1yc2...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

当客户端使用文件中这一行的密钥进行身份验证时,来自客户端的任何命令、shell 或子系统请求都将导致 dropbear 调用列出的命令,而不是客户端请求的命令。这是一个 OpenSSH 服务器功能,dropbear 也支持。

或者,dropbear 有一个命令行选项-c,可让您为所有客户端指定强制命令:

dropbear -p 830 ... -c '/usr/sbin/netconf-subsystem ...'

Dropbear 将为连接到此 dropbear 实例的任何客户端调用指定的命令。如果您想允许客户端执行该命令之外的其他操作,则必须运行两个 dropbear 实例,监听不同的端口或地址。

SFTP 子系统支持:

我将对此进行描述,因为似乎没有很好的记录。如果 dropbear使用 option 编译DROPBEAR_SFTPSERVER,则 dropbear 将为请求“sftp”子系统的客户端调用命令“/usr/libexec/sftp-server”。为此,管理员通常会从 OpenSSH 源代码构建OpenSSH sftp-server程序的副本,并将生成的程序安装为/usr/libexec/sftp-server.

更改 dropbear 以运行不同的命令需要更改 dropbear 源代码并重新编译 dropbear。


推荐阅读