根据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。